2009-04-18 15 views
30

¿Cuál es el equivalente de Groovy del siguiente código de Perl?Sintaxis de Groovy para la expresión regular que coincide

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

sé que hay más de una manera de hacerlo (incluyendo la forma habitual de Java) - pero lo que es la "manera maravillosa" de hacerlo?

Esta es una forma de hacerlo, pero se siente un poco torpe, especialmente la notación de matriz (m[0][1]) que se siente un poco extraño. ¿Hay una mejor manera de hacerlo? De lo contrario, describa la lógica detrás de m[0][1].

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

Respuesta

13

Este fue el valor más cercano al código Perl que podía lograr:

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

¿Qué significa esto? Parece confuso a simple vista. –

+0

¿Cómo funciona esto? ¿Qué hace esto? Parece confuso a simple vista. –

+0

¿por qué envuelve la parte '' 'm = txt = ~ /: (. +?): /' '' En una instrucción if? – Sajuuk

0

Este es mi mejor entendimiento de cómo hacer esto sintaxis maravilloso usando (pero véase la respuesta de lfaraone también):

import java.util.regex.Matcher 

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

Gracias por su respuesta! Creo que su código fallará con una excepción IndexOutOfBoundsException si no hay coincidencia. Edité mi publicación antes de ver su respuesta, por lo que es posible que desee volver a visitar su publicación. Por favor, vea las cosas sobre la notación m [0] [1]. – knorv

+1

Gracias, he actualizado mi respuesta. Además, un Matcher en Java puede tener múltiples coincidencias. (Piense en la bandera/g para las coincidencias de Perl). El primer índice le permite especificar la coincidencia que le interesa. –

51

m[0] es el primer objeto de coincidencia.
m[0][0] es todo lo que coincide en este partido.
m[0][1] es la primera captura en este partido.
m[0][2] es la segunda captura en este partido.

Sobre la base de lo que he leído (no hacer el programa en Groovy o tener una copia a mano), dado

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

m[0][0] será "bar"
m[0][1] será "ba"
m[0][2] habrá "r"
m[1][0] será "baz"
m[1][1] será "ba"
m[1][2] habrá "z"

no podía soportar no saber si era correcto o no, lo que he descargado maravilloso y escribió un ejemplo:

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

Gracias por su respuesta. ¿Podría dar un ejemplo sobre cuándo podría haber múltiples objetos coincidentes (m [1])? – knorv

Cuestiones relacionadas