Quel est l'équivalent Groovy du code Perl suivant?
my $txt = "abc : groovy : def";
if ($txt =~ / : (.+?) : /) {
my $match = $1;
print "MATCH=$match\n";
# should print "MATCH=groovy\n"
}
Je sais qu'il y a plus d'une façon de le faire (y compris la manière régulière Java) - mais quelle est la "façon Groovy" de le faire?
C'est une façon de le faire, mais cela semble un peu maladroit - en particulier la notation de tableau (m[0][1]
) qui semble un peu étrange. Existe-t-il une meilleure façon de procéder? Sinon - veuillez décrire la logique derrière m[0][1]
.
def txt = "Java : groovy : grails"
if ((m = txt =~ / : (.+?) :/)) {
def match = m[0][1]
println "MATCH=$match"
}
C'était la correspondance la plus proche du code Perl que j'ai pu obtenir:
def txt = "abc : groovy : def"
if ((m = txt =~ / : (.+?) : /)) {
def match = m.group(1)
println "MATCH=$match"
}
m[0]
est le premier objet de correspondance.m[0][0]
est tout ce qui correspond dans ce match.m[0][1]
est la première capture de cette correspondance.m[0][2]
est la deuxième capture de cette correspondance.
Sur la base de ce que j'ai lu (je ne programme pas en Groovy ou n'ai pas de copie à portée de main), étant donné
def m = "barbaz" =~ /(ba)([rz])/;
m[0][0]
sera "bar"
m[0][1]
sera "ba"
m[0][2]
sera "r"
m[1][0]
sera "baz"
m[1][1]
sera "ba"
m[1][2]
sera "z"
Je ne pouvais pas supporter de ne pas savoir si j'avais raison ou non, alors j'ai téléchargé groovy et écrit un exemple:
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]
C'est ma meilleure compréhension de la façon de faire cela en utilisant la syntaxe Groovy (mais voir aussi la réponse de lfaraone):
import Java.util.regex.Matcher
def txt = 'abc : groovy : def'
if (txt =~ ~/ : (.+?) : /) {
def match = Matcher.lastMatcher[0][1]
println "MATCH=$match"
}