2011-10-24 20 views
1

呃...我有一個包含丁丁腳本的文件。現在我已經設法抓住所有操作和替換,以便使用Ruby在網站上正確顯示它們,這有助於我進行概述。如何在Java中編寫Ruby-regex模式(包括遞歸命名分組)?

例丁丁腳本

#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} 

搶他們在我的Ruby應用程序內,我讀我的腳本文件到一個varibable「輸入」,然後使用下面的模式來掃描「輸入」

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 
} 

現在我的想法是使用NetBeans平臺上寫一個模塊,不僅保持良好的概貌也協助編輯丁丁腳本文件。因此,在編輯器窗口中打開文件,我仍然需要解析tintin文件,並從文件中抓取並顯示所有「操作」和「替換」,以便我可以通過dbl單擊打開一個項目一個修改窗口。

我設置的模塊,並把一切都準備好,到目前爲止,我只是無法弄清楚如何翻譯我寫來運行一個Java正則表達式模式紅寶石正則表達式。似乎命名組捕獲,尤其是Java中不支持這些組的遞歸應用程序。如果沒有似乎無法找到一個有效的解決方案......

這裏再次紅寶石圖案...

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

誰能幫我創建相匹配的一個java模式相同?

提前非常感謝提示/提示/想法,特別是對解決方案或(近於解決方案的意見)!

+1

不太回答你的問題,但我寧願使用這種任務的合適解析器(比如,[ANTLR(http://www.antlr.org))反正。 – Slartibartfast

回答

2

你的文本格式看起來很簡單;有可能你並不需要遞歸匹配。這與Java兼容的正則表達式的樣本數據正確匹配,至於我可以告訴大家:

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

會爲你工作?如果你運行Java 7,你甚至可以命名組。 ;)

+0

使用Regex Tester和RegExr,該模式只匹配#substitution塊並忽略#action塊。 –

+0

對不起,我忘了爲DOTALL模式添加'(?s)'修飾符(Ruby稱爲「多行」模式)。 –

+0

感謝給我一個可能的解決方案,以抓取文件中的所有替換和動作。雖然它不能確保所有的嵌套模式都能正確嵌套,但我可以通過一些額外的代碼來解決這個問題。榮譽!謝謝 – Ingo

1

誰能幫我創建相匹配的同樣一個java模式?

不,沒人能夠:Java的正則表達式引擎不支持遞歸模式(就像Ruby 1.9那樣)。

+0

我發現已經出來,但沒有辦法重現模式沒有遞歸? – Ingo

+0

難道這不能通過使用'Pattern'類來編譯正則表達式,然後爲該字符串創建一個'Matcher',通過循環來獲取匹配它的組?我可能會完全誤解。 –

+0

@Ingo,err,該模式調用自己使其(理論上)匹配無限量的嵌套匹配。所以不,這不能用不支持遞歸的正則表達式來表達。 –