2011-10-24 4 views
1

まあ...私はtintinスクリプトを含むファイルを持っています。今では、Rubyを使ってウェブサイト上で適切に注文されたことを示すために、すべてのアクションとその置換を取得することができました。JavaでRuby-regexパターンを書くには(再帰的な名前付きグループ化を含む)?

例TINTIN-スクリプトは

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

私の考えは、概要を保存するだけでなく、tintinスクリプトファイルの編集を支援するモジュールを書くためにnetbeansプラットフォームを使用することでした。エディタウィンドウでファイルを開くには、まだtintinファイルを解析し、ファイルからすべての 'アクション'と '置換'をeTableに表示して表示する必要があります。変更ウィンドウ。

私はモジュールをセットアップしてこれまでのところ準備ができていますが、私が作ったruby-regexパターンをjava-regex-patternに変換する方法は分かりません。名前付きグループキャプチャと思われます。特に、これらのグループの再帰的アプリケーションは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

申し訳ありませんが、 '(?s)'修飾子をDOTALLモード(Rubyが "multiline"モードと呼ぶ)に追加するのを忘れました。 –

+0

ファイルからのすべての置換とアクションを取得するための解決策を私に教えてくれてありがとう。すべてのネストされたパターンが正しくネストされていることを確認していないにもかかわらず、グループを取得したら、いくつかの追加コードで修正することができます!名声!ありがとう – Ingo

1

誰も私に同じに一致するJavaパターンを作成するのに役立つことはできますか?

Javaの正規表現エンジンは、(Ruby 1.9のように)再帰パターンをサポートしていません。

+0

私はすでにそれを見つけましたが、再帰なしでパターンを再現する方法はありませんか? – Ingo

+0

'Pattern'クラスを使って正規表現をコンパイルし、文字列の' Matcher'を作成し、ループしてそれに合ったグループを取得しますか?私は完全に誤解している可能性があります。 –

+0

@Ingo、err、パターンは、理論的には無限のネストされたマッチと(理論的に)一致するようにそれ自身を呼び出します。だから、再帰をサポートしていない正規表現エンジンでは表現できません。 –

関連する問題