2011-10-24 2 views
1

음 ... tintin 스크립트가 포함 된 파일이 있습니다. 이제는 Ruby를 사용하여 웹 사이트에서 적절하게 명령 된 것을 보여주기 위해 이미 모든 작업과 대체 작업을 잡아 냈습니다. 따라서 개요를 유지하는 데 도움이됩니다.Java에서 Ruby-regex 패턴을 작성하는 방법 (재귀 적 그룹핑 포함)?

예 틴틴 스크립트 나는 varibable '입력'으로 내 스크립트 파일을 읽고 다음 '입력'

를 스캔하려면 다음 패턴을 사용하여 내 루비 앱에서 그들을 잡아

#substitution {You tell {([a-zA-Z,\-\ ]*)}, %*$} 
       {<279>[<269> $sysdate[1]<279>, <269>$systime<279> |<219> Tell <279>] <269>to <219>%2<279> : <219>%3} 
       {4} 
#substitution {{([a-zA-Z,\-\ ]*)} tells you, %*$} 
       {<279>[<269> $sysdate[1]<279>, <269>$systime<279> |<119> Tell <279>] <269>from <119>%2<279> : <119>%3} 
       {2} 

#action {Your muscles suddenly relax, and your nimbleness is gone.} 
{ 
    #if {$sw_keepaon} 
    { 
     aon; 
    }; 
} {5} 

#action {xxxxx} 
{ 
    #if {$sw_keepfamiliar} 
    { 
     familiar $familiar; 
    }; 
} {5} 

pattern = /(?<braces>{([^{}]|\g<braces>)*}){0}^#(?<type>action|substitution)\s*(?<b1>\g<braces>)\s*(?<b2>\g<braces>)\s*(?<b3>\g<braces>)/im 

input = "" 

File.open("/home/igambin/lmud/lmud.tt") { |file| input = file.read } 

input.scan(pattern) { |prio, type, pattern, code| 
    ## here i usually create objects, but for simplicity only output now 
    puts "Type : #{type}" 
    puts "Pattern : #{pattern}" 
    puts "Priority: #{prio}" 
    puts "Code :\n#{code}" 
    puts 
} 
지금 내 생각은 단지 개요를 유지하지 할 수있는 모듈을 작성하는 넷빈즈 플랫폼을 사용할뿐만 아니라 틴틴 스크립트 파일을 편집을 지원하는 것이 었습니다. 그래서 Editor-Window에서 파일을 여는 동안 나는 틴틴 파일을 파싱해야하고 파일에서 '액션'과 '대체물'을 모두 가져 와서 eTable에 표시해야한다. 하나의 항목을 dbl- 클릭하여 열 수있다. 수정 창.

나는 설정을 모듈을했습니다 지금까지, 난 그냥 작동 자바 정규식 패턴에 작성한 루비 정규식 패턴을 번역하는 방법을 알아낼 수 없습니다 모든 준비를 얻었다. 명명 된 그룹 캡처로 보이고 특히 이러한 그룹의 재귀 적 응용 프로그램은 Java에서 지원되지 않습니다. 없이 그 내가이 작업 솔루션을 찾을 수 없습니다 것 같다 ... 여기

다시 루비 패턴의 ...

pattern = /(?<braces>{([^{}]|\g<braces>)*}){0}^#(?<type>action|substitution)\s*(?<b1>\g<braces>)\s*(?<b2>\g<braces>)\s*(?<b3>\g<braces>)/im 

사람이 일치하는 자바 패턴을 생성하는 데 도움이 수 같은? 팁/힌트/아이디어 특히 솔루션 또는 (근접에-솔루션 댓글) 사전에

많은 감사합니다!

+1

그렇진 대답을하지만 오히려 어쨌든 작업의 ​​종류에 대한 적절한 파서를 (예를 들어, [ANTLR] (http://www.antlr.org)) 사용합니다. – Slartibartfast

답변

2

텍스트 형식은 매우 간단 보인다; 재귀 적 매칭이 필요하지 않을 수도 있습니다. 이 자바 호환 정규 표현식은 지금까지 내가 말할 수있는, 제대로 샘플 데이터와 일치 :

(?s)#(substitution|action)\s*\{(.*?)\}\s*\{(.*?)\}\s*\{(\d+)\} 

겠습니까 당신을 위해 그 일? Java 7을 실행하면 그룹의 이름을 지정할 수도 있습니다.) 질문에

+0

Regex Tester와 RegExr을 사용하면 패턴이 #substitution 블록과 일치하고 #action 블록을 무시합니다. –

+0

죄송합니다. DOTALL 모드 (Ruby가 "multiline"모드라고 부르는 것)에'(? s)'수정자를 추가하는 것을 잊었습니다. –

+0

파일에서 모든 대체 및 작업을 가져올 수있는 솔루션을 제공해 주셔서 감사합니다. 모든 중첩 된 패턴이 올바르게 중첩되어 있는지도 확인하지는 않지만 일단 그룹을 만들면 추가 코드로 수정할 수 있습니다! 명성! 그리고 감사합니다 – Ingo

1

사람이 같은 일치하는 자바 패턴을 생성하는 데 도움이 수 있습니까?

아니요, 누구도 다음을 수행 할 수 없습니다. Java의 정규식 엔진은 재귀 패턴 (Ruby 1.9 에서처럼)을 지원하지 않습니다.

+0

이미 그걸 알았지 만 재귀없이 패턴을 재현 할 방법이 없습니까? – Ingo

+0

'Pattern' 클래스를 사용하여 정규식을 컴파일 한 다음 문자열에 대해'Matcher '를 작성하고 루프를 통해 그룹과 일치하는 그룹을 가져 오지 못합니까? 나는 완전히 오해 할 수있다. –

+0

@Ingo, err, 패턴은 스스로를 호출하여 이론적으로 무한대의 중첩 된 일치와 일치시킵니다. 그래서 재귀를 지원하지 않는 정규식 엔진으로는 표현할 수 없습니다. –