Ответ 1
Это было самое близкое соответствие с кодом Perl, который я мог бы достичь:
def txt = "abc : groovy : def"
if ((m = txt =~ / : (.+?) : /)) {
def match = m.group(1)
println "MATCH=$match"
}
Что такое 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"
}
Это было самое близкое соответствие с кодом Perl, который я мог бы достичь:
def txt = "abc : groovy : def"
if ((m = txt =~ / : (.+?) : /)) {
def match = m.group(1)
println "MATCH=$match"
}
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]
Это мое лучшее понимание того, как это сделать, используя синтаксис Groovy (но см. также ответ lfaraone):
import java.util.regex.Matcher
def txt = 'abc : groovy : def'
if (txt =~ ~/ : (.+?) : /) {
def match = Matcher.lastMatcher[0][1]
println "MATCH=$match"
}