Подтвердить что ты не робот

Groovy синтаксис для регулярного выражения

Что такое Groovy эквивалент следующего кода Perl?

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

Я знаю, что есть более чем один способ сделать это (в том числе обычный Java-способ), но что такое Groovy способ сделать это?

Это один из способов сделать это, но он чувствует себя немного неуклюжим - особенно обозначение массива (m[0][1]), которое немного странно. Есть ли лучший способ сделать это? Если нет - пожалуйста, опишите логику m[0][1].

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

Ответ 1

Это было самое близкое соответствие с кодом Perl, который я мог бы достичь:

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

Ответ 2

m[0] - первый объект совпадения.
m[0][0] - это все, что соответствует этому совпадению.
m[0][1] - первый захват в этом матче.
m[0][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"

Я не мог стоять, не зная, был ли я прав или нет, поэтому я загрузил Groovy и написал пример:

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]

Ответ 3

Это мое лучшее понимание того, как это сделать, используя синтаксис Groovy (но см. также ответ lfaraone):

import java.util.regex.Matcher

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