2012-06-22 15 views
11

Me preguntaba si Java tenía un equivalente a la coincidencia de patrón con nombre de C#. Por ejemplo, en C# Puedo hacer algo como esto:Soporte de Java para "(? <name> patrón)" en patrones

var pattern = @";(?<foo>\d{6});(?<bar>\d{6});"; 
var regex = new Regex(pattern , RegexOptions.None); 
var match = regex.Match(";123456;123456;"); 

var foo = match.Groups["foo"].Success ? match.Groups["foo"].Value : null; 
var bar = match.Groups["bar"].Success ? match.Groups["bar"].Value : null; 

Esto sólo parece ser una manera limpia para agarrar grupos. ¿Puede Java hacer algo similar, o debo tomar grupos en función de la posición del índice?

String foo = matcher.group(0); 
+0

Una de las cosas más molestas sobre java = \ – Falmarri

Respuesta

16

Esto está soportado a partir de Java 7. Su código C# puede ser traducido a algo como esto:

String pattern = ";(?<foo>\\d{6});(?<bar>\\d{6});"; 
Pattern regex = Pattern.compile(pattern); 
Matcher matcher = regex.matcher(";123456;123456;"); 
boolean success = matcher.find(); 

String foo = success ? matcher.group("foo") : null; 
String bar = success ? matcher.group("bar") : null; 

usted tiene que crear un objeto Matcher que en realidad no realizar la prueba de expresiones regulares hasta que llame find().

(he usado find() porque puede encontrar una coincidencia en cualquier parte de la cadena de entrada, al igual que el método Regex.Match(). El método .matches() sólo devuelve verdadero si la expresión coincide con la cadena de entrada.)

+1

Gracias por la respuesta rápida. Desafortunadamente, todavía estamos usando Java 6. Tal vez solo voy a crear una enumeración: String foo = matcher.group (MyGroups.FOO); – aelstonjones

+1

Consulte el proyecto [named-regexp] (http://code.google.com/p/named-regexp/). Su propósito específico es proporcionar una forma de manejar grupos con nombre previo a Java7. – matts

+1

Se prefiere la horquilla actualizada de ['named-regexp'] (http://tony19.github.io/named- regexp). – user46874

-2

creo que necesita importar

org.apache.commons.lang3.StringUtils;

para este

private Boolean validateEmail(String email) 
    { 
     return email.matches("^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(\\.[a-zA-Z](-?[a-zA-Z0-9])*)+$"); 
    } 

    private Boolean validateIP(String IP) 
    { 
     return IP.matches("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); 
    } 

    private Boolean validateHostname(String Hostname) 
    { 
     return Hostname.matches("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\-]*[A-Za-z0-9])$"); 
    } 
+0

podría haber entendido mal la pregunta. vuelve a leerlo y ahora esto no parece lo que quieres. no sé lo que quiere decir con "grupos de agarrar" –

+0

Básicamente, quiero una manera limpia de obtener un patrón combinado de la matriz de grupo sin usar números de índice sino un nombre en su lugar. – aelstonjones

2

Java v1.7 ahora admite grupos nombrados Perl-standard como (?<name>...) y \k<name> en patrones.

No puede haber nombres de grupo duplicados en el mismo patrón, lo que puede ser molesto en casos muy complejos en los que se construyen patrones más grandes fuera de control de objetos más pequeños. También carece de indexación relativa.

Sin embargo, debería ser suficiente para cosas tan simples como parece estar escribiendo.

Cuestiones relacionadas