2013-09-05 2 views
0

XML 덤프에서 Wiki 텍스트를 구문 분석하고 있는데, 'section'이라는 문자열에는 재구성하려는 일부 인수를 포함하여 이중 괄호로 묶인 템플릿이 포함되어 있습니다. 내가왔다,루비에서 gsub로 스캔 바꾸기 : gsub 블록에서 코드를 허용하는 방법?

section.scan(/\{\{(TextTerm)\|(.*?)\|(.*?)\}\}/i).each { |item| puts "1=" + item[1] # arg1a etc.} 

을 그리고 :

section="Sample of a text with a first template {{TextTerm|arg1a|arg2a|arg3a...}} and then a second {{TextTerm|arg1b|arg2b|arg3b...}} etc." 

내가 사용하는 루프에 각 템플릿과 작업을 얻을 수 scan 및 정규식을 사용할 수 있습니다

이라는 TextTerm를 예를 가지고 템플릿의 첫 번째 인수의 데이터베이스를 추출 할 수 있어야합니다.

이제 "NewTextTerm"템플릿의 이름을 바꾸고 첫 번째 인수 대신 두 번째 인수를 배치하여 인수를 재구성하려고합니다.

동일한 루프에서 수행 할 수 있습니까? gsub(rgexp){ block}에 의해 scan을 변경하여 예를 들어 :

section.gsub!(/\{\{(TextTerm)\|(.*?)\|(.*?)\}\}/) { |item| '{{NewTextTerm|\2|\1}}'} 

내가 얻을 :

"Sample of a text with a first template {{NewTextTerm|\\2|\\1}} and then a second {{NewTextTerm|\\2|\\1}} etc." 

는 정규 표현식의 인수가 인식되지 않는 것을 의미한다. 비록 효과가 있었다고해도, 나는 인수에서 작업하기 위해 gsub 블록 안에 어떤 장소를 갖고 싶습니다. 예를 들어 scan().each 블록과 비슷하지만 대체 할 문자열 만 gsub 블록에 puts을 사용할 수 없습니다.

모든 아이디어를 환영합니다.

추신 : 일부 수정 : 중괄호와 "section = added", 코드가 완성되었습니다.

+0

이 주석은 적절하게 upvoted 수 있도록 답변 자격이 있습니다. – DNNX

+0

이중 ** 괄호 ** 또는 이중 ** 괄호 **를 의미합니까? – sawa

+0

단일 행이 아닌 전체 코드 예제를 보여줍니다. 짧은 루프에서 전체 문제를 처리하는 더 좋은 방법이 있지만 코드를 보지 않아도 사용자가 설정 한 내용을 알 수 없습니다. 결과적으로 점진적인 향상을 제안 할 수 있지만 근본적으로 더 나은 것을 제안 할 수 있습니다. 또한 작업중인 텍스트의 큰 샘플을 볼 필요가 있습니다. 파일 전체에 동일한 태그 세트가있는'{{...}} '블록이 반복됩니까? 템플릿 처리 엔진을 작성하는 것은 어렵지 않지만 더 나은 정보가 필요합니다. –

답변

0

당신이 문자열 인수로 교체가있을 때,이 같은 등 '\1' 사용할 수 있습니다 : 당신이 블록으로 교체가있을 때

string.gsub!(regex, '...\1...\2...') 

,이 같은 "#$1" 등을 사용할 수 있습니다 :

string.gsub!(regex){"...#$1...#$2..."} 

용도가 혼합되어 있습니다. 둘 중 하나에 집착하십시오.

0

예, 큰 따옴표로 견적을 변경하는 것만으로는 충분하지 않습니다. # $ 1이 답입니다. 완전한 코드는 다음과 같습니다.

section="Sample of a text with a first template {{TextTerm|arg1a|arg2a|arg3a...}} and then a second {{TextTerm|arg1b|arg2b|arg3b...}} etc." 
section.gsub(/\{\{(TextTerm)\|(.*?)\|(.*?)\}\}/) { |item| "{{New#$1|#$3|#$2}}"} 
"Sample of a text with a first template {{NewTextTerm|arg2a|arg3a...|arg1a}} and then a second {{NewTextTerm|arg2b|arg3b...|arg1b}} etc." 

따라서 작동합니다. 감사.

def stringreturn(arg1,arg2,arg3) strr = "{{New"+arg1 + arg3 +arg2 + "}}"; return strr ; end 

section.gsub(/\{\{(TextTerm)\|(.*?)\|(.*?)\}\}/) { |item| stringreturn("#$1","|#$2","|#$3") } 

가 반환합니다 :

는하지만 지금은 변경된 문자열을 반환하는 "기능"에 의해 문자열을 교체해야

"Sample of a text with a first template {{NewTextTerm|arg2a|arg3a...|arg1a}} and then a second {{NewTextTerm|arg2b|arg3b...|arg1b}} etc." 

덕분를 모든! Ruby를 사용하여 MediaWiki 템플릿에서 인수를 조작하는 더 좋은 방법이 있습니다.

관련 문제