2009-04-18 5 views
30

Was ist das Groovy-Äquivalent des folgenden Perl-Codes?Groovy-Syntax für die Übereinstimmung regulärer Ausdrücke

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

Ich weiß, dass mehr als ein Weg gibt, es zu tun (einschließlich der regelmäßigen Java Art und Weise) - aber was ist die „Groovy Art und Weise“, es zu tun?

Dies ist ein Weg, es zu tun, aber es fühlt sich ein wenig ungeschickt - vor allem die Array-Notation (m[0][1]), die ein bisschen seltsam fühlt. Gibt es einen besseren Weg? Wenn nicht - bitte beschreiben Sie die Logik hinter m[0][1].

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

Antwort

13

Dies war die größte Übereinstimmung mit dem Perl-Code, den ich erreichen konnte:

+1

Was wird gedruckt? Sieht für das bloße Auge verwirrend aus. –

+0

Wie funktioniert das? Was macht das? Sieht für das bloße Auge verwirrend aus. –

+0

warum wickeln Sie den '' 'm = txt = ~ /: (. +?): /' '' Teil in eine if-Anweisung? – Sajuuk

0

Das ist mein bestes Verständnis dafür, wie dies mit Groovy Syntax zu tun (aber lfaraone Antwort sehen):

import java.util.regex.Matcher 

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

Vielen Dank für Ihre Antwort! Ich denke, dass Ihr Code mit einer IndexOutOfBoundsException fehlschlägt, wenn es keine Übereinstimmung gibt. Ich habe meinen Beitrag bearbeitet, bevor ich Ihre Antwort gesehen habe. Vielleicht möchten Sie Ihren Beitrag erneut besuchen. Bitte sehen Sie sich die m [0] [1] -Notation an. – knorv

+1

Danke, ich habe meine Antwort aktualisiert. Ein Matcher in Java kann auch mehrere Übereinstimmungen haben. (Denken Sie an das Flag/g für Perl-Übereinstimmungen.) Der erste Index ermöglicht es Ihnen, die Übereinstimmung anzugeben, die Ihnen wichtig ist. –

51

m[0] ist das erste übereinstimmende Objekt.
m[0][0] ist alles, was in diesem Spiel übereinstimmt.
m[0][1] ist die erste Aufnahme in diesem Spiel.
m[0][2] ist die zweite Aufnahme in diesem Spiel.

Nach dem, was ich gelesen habe (ich in Groovy nicht Programm tun oder eine Kopie zur Hand haben), da

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

m[0][0] wird "bar"
m[0][1] wird "ba"
m[0][2] wird sein "r"
m[1][0] wird "baz"
m[1][1] wird "ba"sein m[1][2] wird "z"

sein Ich konnte es nicht ertragen, nicht zu wissen, ob ich richtig war oder nicht, so dass ich heruntergeladen groovy und schrieb ein Beispiel:

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

Danke für Ihre Antwort. Könnten Sie ein Beispiel geben, wann es mehrere Match-Objekte (m [1]) geben könnte? – knorv

Verwandte Themen