web-dev-qa-db-fra.com

Syntaxe groovy pour la correspondance d'expressions régulières

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"
}
44
knorv

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"
}
19
knorv

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]
79
Chas. Owens

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"
}
0
Chris Jester-Young