Reguläre Ausdrücke und GWT


81

Meine Fragen sind: Gibt es eine gute Lösung, um reguläre Ausdrücke in GWT zu verwenden?

Ich bin zum Beispiel nicht zufrieden mit der Verwendung von String.split (Regex). GWT übersetzt den Code in JS und verwendet dann den regulären Ausdruck als JS-regulären Ausdruck. Aber ich kann so etwas wie den Java Matcher oder das Java Pattern nicht verwenden. Aber ich würde diese für Gruppenabgleich benötigen.

Gibt es eine Möglichkeit oder Bibliothek?

Ich habe Jakarta Regexp ausprobiert, aber ich hatte andere Probleme, da GWT nicht alle Methoden des Java SDK emuliert, die diese Bibliothek verwendet.

Ich möchte in der Lage sein, so etwas auf der Client-Seite zu verwenden:

// 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);
    }
} 

Antworten:


96

Der gleiche Code mit RegExp könnte sein:

// 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
Sind Sie sicher , dass <=sollte nicht <in <=matcher.getGroupCount()?
Andrey Regentov

@AndreyRegentov Ja. Ich habe das überprüft und dann behoben. Das Coole an diesen Klassen ist, dass GWT eine reine Java-Version bereitstellt, sodass wir ihre Verwendung weiterhin mit JUnit testen können.
PhiLho

32

GWT 2.1 hat jetzt eine RegExpKlasse, die Ihr Problem lösen könnte:


1
Ich schlage vor, den RexExp-Tippfehler zu beheben und den Link hinter RegExp zu setzen, anstatt ihn zu inline.
antony.trupe

19

Diese Antwort deckt ALLE Musterübereinstimmungen ab, nicht nur eine, wie in anderen Antworten hier:

Funktion:

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;
}

... und Beispielverwendung:

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

}

3
Da haben Sie absolut Recht. Dies ist das fehlende Puzzleteil. 10x viel!
Gor

3

Wenn Sie eine reine GWT-Lösung wünschen, bin ich mir nicht sicher, ob dies möglich ist. Wenn Sie jedoch bereit sind, JSNI zu verwenden, können Sie das RegExp-Objekt von JavaScript verwenden, um die übereinstimmenden Gruppen und alle abzurufen. Sie müssen JSNI für GWT und JavaScript RegExp lernen.


Ich habe darüber nachgedacht, aber ich fand es keine
gute

0

Die GWTx-Bibliothek scheint eine Emulation von java.util.regex.Pattern und Freunden bereitzustellen. Es sieht nicht vollständig aus (insbesondere Matcher), könnte aber ein guter Anfang sein.

Die Technik, mit der sie ihre eigenen Implementierungen von Java-Klassen für die Clientseite einbinden, ist die <super-source>Deklaration im Modul XML. Es wird in GWT-Dokumenten, Beschreibung des XML-Formatmoduls unter "Überschreiben einer Paketimplementierung mit einer anderen" erwähnt. Standard JRE-übersetzbare Klassen in GWT werden auf die gleiche Weise emuliert.


Hallo, ich habe diese Bibliothek schon einmal ausprobiert. Es ist eine gute Lösung für fehlende JRe-Emulation, aber in diesem Fall wird die Gruppierung nicht unterstützt. Die Methoden hierfür fehlen.
Ludwigm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.