2009-04-18 21 views
30

次のPerlコードに相当するGroovyとは何ですか?正規表現マッチング用のGroovy構文

my $txt = "abc : groovy : def"; 
if ($txt =~/: (.+?) : /) { 
    my $match = $1; 
    print "MATCH=$match\n"; 
    # should print "MATCH=groovy\n" 
} 

私は(通常のJavaの道を含む)、それを行うための複数の方法があることを知っている - しかし、それを行うための「Groovyの道」は何ですか?

これはこれを行う1つの方法ですが、ちょっと変わった感じがする配列表記(m[0][1])がちょっと不思議です。より良い方法がありますか?そうでない場合は、m[0][1]の背後にあるロジックを記述してください。

def txt = "java : groovy : grails" 
if ((m = txt =~/: (.+?) :/)) { 
    def match = m[0][1] 
    println "MATCH=$match" 
} 

答えて

13

これは私が達成できるPerlコードに最も近いものだった。

def txt = "abc : groovy : def" 
if ((m = txt =~/: (.+?) : /)) { 
    def match = m.group(1) 
    println "MATCH=$match" 
} 
+1

これは何を印刷しますか?肉眼では混乱しているように見えます。 –

+0

これはどのように機能しますか?これは何をするのですか?肉眼では混乱しているように見えます。 –

+0

if文に '' 'm = txt =〜/ :(。+?):/' ''部分をラップするのはなぜですか? – Sajuuk

0

これは、この使用してGroovyの構文を実行します(ただし、あまりにもlfaraoneの応答を参照してください)する方法の私の最高の理解です:

import java.util.regex.Matcher 

def txt = 'abc : groovy : def' 
if (txt =~ ~/ : (.+?) : /) { 
    def match = Matcher.lastMatcher[0][1] 
    println "MATCH=$match" 
} 
+0

感謝を!私は一致しない場合、あなたのコードはIndexOutOfBoundsExceptionで失敗すると思います。私はあなたの返事を見る前に自分の投稿を編集しました。あなたの投稿を再訪したいかもしれません。 m [0] [1]表記についての情報をご覧ください。 – knorv

+1

ありがとう、私は私の答えを更新しました。また、JavaのMatcherは複数のマッチを持つことができます。 (Perlの一致については/ gフラグを考えてください)最初のインデックスでは、気になる一致を指定することができます。 –

51

m[0]が最初に一致するオブジェクトです。
m[0][0]はこの試合でマッチしたものすべてです。
m[0][1]は、この試合の最初のキャプチャです。
m[0][2]はこの試合で2度目のキャプチャです。私が読んだものに基づいて

(私はプログラムがGroovyでないか、便利なコピーを持っている)、

def m = "barbaz" =~ /(ba)([rz])/; 

m[0][0]与え"bar"
m[0][1]"ba"
m[0][2]になりますでしょう"r"
になります m[1][0]"baz"
m[1][1]"ba"
m[1][2]になります"z"

私は私が正しいかではなかった場合は知らない立つことができなかったので、私はグルーヴィーダウンロードし、例を書いた:あなたの返信用

def m = "barbaz" =~ /(ba)([rz])/; 

println "m[0][0] " + m[0][0] 
println "m[0][1] " + m[0][1] 
println "m[0][2] " + m[0][2] 
println "m[1][0] " + m[1][0] 
println "m[1][1] " + m[1][1] 
println "m[1][2] " + m[1][2] 
+1

ご返信ありがとうございます。複数のマッチオブジェクト(m [1])が存在する場合の例を挙げてください。 – knorv