2009-07-21 20 views
73

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

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

Gibt es eine Möglichkeit oder eine Bibliothek?

Ich versuchte Jakarta Regexp, aber ich hatte andere Probleme, weil GWT nicht alle Methoden des Java SDK emuliert, das diese Bibliothek verwendet.

Ich möchte so etwas wie dies auf der Client-Seite in der Lage sein 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); 
    } 
} 

Antwort

87

Der gleiche Code RegExp verwendet, 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 '<=' nicht '<' in '<= matcher.getGroupCount()' sein sollte? –

+0

@AndreyRegentov Ja. Ich überprüfte, dann reparierte ich das. Was bei diesen Klassen cool ist, ist, dass GWT eine reine Java-Version liefert, so dass wir ihre Verwendung mit JUnit noch testen können. – PhiLho

3

Wenn Sie eine reine GWT Lösung wollen, ich bin nicht sicher, dass es getan werden kann. Wenn Sie jedoch JSNI verwenden möchten, können Sie das RegExp-Objekt von JavaScript verwenden, um die übereinstimmenden Gruppen und alle zu erhalten. Sie müssen JSNI für GWT und JavaScript RegExp-Objekt lernen.

+0

ich dachte darüber nach, aber ich fand es keine schöne Lösung – ludwigm

0

Die GWTx library scheint eine Emulation von java.util.regex.Pattern und Freunden zu bieten. Es sieht nicht vollständig aus (Matcher im Besonderen), aber könnte ein guter Anfang sein.

Die Technik, die sie verwenden, um ihre eigenen Implementierungen von Java-Klassen für den Client zu schließen, ist die <super-source> Deklaration in Modul XML. Es wird in der GWT-Dokumentation, Modul-XML-Formatbeschreibung unter "Überschreiben einer Paketimplementierung durch eine andere" erwähnt. Standard-JRE-übersetzbare Klassen in GWT werden auf die gleiche Weise emuliert.

+0

Hallo, ich habe diese Bibliothek schon einmal ausprobiert. Es ist eine gute Lösung für fehlende JRe-Emulation, aber in diesem Fall unterstützt es keine Gruppierung. Die Methoden dafür fehlen. – ludwigm

32

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

+1

Ich empfehle, den RexExp-Tippfehler zu beheben und den Link hinter RegExp zu setzen, anstatt ihn inline zu schreiben. –

+1

Danke. Ist das besser? –

17

Diese Antwort deckt alle Muster übereinstimmt, nicht nur eine, wie in anderen hier Antworten:

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

Sie haben absolut Recht auf diesem. Dies ist das fehlende Teil des Puzzles. 10x viel! – gor