Expresiones regulares y GWT

81

Mi pregunta es: ¿Existe una buena solución para usar expresiones regulares en 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 expresión regular de JS. Pero no puedo usar algo como Java Matcher o Java Pattern. Pero necesitaría estos para emparejar grupos.

¿Existe alguna posibilidad o biblioteca?

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

Quiero poder 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);
    }
} 
Ludwigm
fuente

Respuestas:

96

El mismo código que usa RegExp podría 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);
    }
}
AleArnaiz
fuente
2
¿Estás seguro de que <=no debería estar <en <=matcher.getGroupCount()?
Andrey Regentov
@AndreyRegentov Sí. Lo comprobé y luego lo arreglé. 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
32

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

Philippe Beaudoin
fuente
1
Sugiero corregir el error tipográfico de RexExp y poner el enlace detrás de RegExp en lugar de en línea.
antony.trupe
19

Esta respuesta cubre TODAS las coincidencias de patrones, no solo una, como en otras 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);

}
Chris W
fuente
3
Tienes toda la razón en esto. Esta es la pieza que falta en el rompecabezas. 10x mucho!
gor
3

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

Arrasar
fuente
Pensé en eso, pero no encontré una buena solución
ludwigm
0

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

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


fuente
hola probé esta biblioteca antes. Es una buena solución para la falta de emulación de JRe, pero en este caso no admite la agrupación. Faltan los métodos para esto.
ludwigm