2009-07-21 66 views
73

Mi pregunta es: ¿hay una buena solución para usar expresiones regulares en GWT?Expresiones regulares y GWT

No estoy satisfecho con el uso de String.split (regex) por ejemplo. GWT traduce el código a JS y luego usa la expresión regular como una expresión regular de JS. Pero no puedo usar algo como Java Matcher o Java Pattern. Pero necesitaría estos para la coincidencia de grupos.

¿Hay alguna posibilidad o biblioteca?

Probé Jakarta Regexp, pero tuve otros problemas porque GWT no emula todos los métodos del SDK de Java que esta biblioteca utiliza.

Quiero ser capaz de usar algo como esto en el lado del cliente:

// Compile and use regular expression 
Pattern pattern = Pattern.compile(patternStr); 
Matcher matcher = pattern.matcher(inputStr); 
boolean matchFound = matcher.find(); 

if (matchFound) { 
    // Get all groups for this match 
    for (int i=0; i<=matcher.groupCount(); i++) { 
     String groupStr = matcher.group(i); 
     System.out.println(groupStr); 
    } 
} 

Respuesta

87

El mismo código utilizando RegExp podrían ser:

// Compile and use regular expression 
RegExp regExp = RegExp.compile(patternStr); 
MatchResult matcher = regExp.exec(inputStr); 
boolean matchFound = matcher != null; // equivalent to regExp.test(inputStr); 

if (matchFound) { 
    // Get all groups for this match 
    for (int i = 0; i < matcher.getGroupCount(); i++) { 
     String groupStr = matcher.getGroup(i); 
     System.out.println(groupStr); 
    } 
} 
+2

¿Estás seguro de que '<=' no debería ser '<' en '<= matcher.getGroupCount()'? –

+0

@AndreyRegentov Sí. Lo revisé, luego lo solucioné. Lo bueno de estas clases es que GWT proporciona una versión pura de Java, por lo que aún podemos probar su uso con JUnit. – PhiLho

3

Si desea una solución GWT pura, no estoy seguro de que se puede hacer. Pero si está dispuesto a usar JSNI, puede usar el objeto RegExp de JavaScript para obtener los grupos coincidentes y todo. Necesitará aprender el objeto RegExp de JSNI para GWT y JavaScript.

+0

pensé en eso, pero no encontré que sea una buena solución – ludwigm

0

El GWTx library parece proporcionar una emulación de java.util.regex.Pattern y sus amigos. No parece completo (en particular, Matcher), pero podría ser un buen comienzo.

La técnica que utilizan para conectar sus propias implementaciones de las clases de Java para el lado del cliente es la declaración <super-source> en el módulo XML. Se menciona en los documentos de GWT, la descripción del formato del módulo XML en "Anulación de la implementación de un paquete con otro". Las clases traducibles estándar de JRE en GWT se emulan de la misma manera.

+0

hola intenté esta biblioteca antes. es una buena solución para la emulación de JRe que falta, pero en este caso no es compatible con la agrupación. Los métodos para esto faltan. – ludwigm

32

GWT 2.1 ahora tiene una clase RegExp que podría resolver su problema:

+1

Sugiero corregir el error tipográfico RexExp y poner el enlace detrás de RegExp en lugar de en línea. –

+1

Gracias. ¿Es esto mejor? –

17

Esta respuesta cubre coincide con todos los patrones, no sólo una, como en otra respuestas aquí:

Función:

private ArrayList<String> getMatches(String input, String pattern) { 
    ArrayList<String> matches = new ArrayList<String>(); 
    RegExp regExp = RegExp.compile(pattern, "g"); 
    for (MatchResult matcher = regExp.exec(input); matcher != null; matcher = regExp.exec(input)) { 
     matches.add(matcher.getGroup(0)); 
    } 
    return matches; 
} 

... y uso de muestra:

ArrayList<String> matches = getMatches(someInputStr, "\\$\\{[A-Za-z_0-9]+\\}"); 
for (int i = 0; i < matches.size(); i++) { 
    String match = matches.get(i); 

} 
+3

Tiene toda la razón en este caso. Esta es la pieza que falta del rompecabezas. 10 veces mucho! – gor

Cuestiones relacionadas