2009-07-21 15 views
73

Moje pytania brzmią: Czy istnieje dobre rozwiązanie do używania wyrażenia regularnego w GWT?Wyrażenia regularne i GWT

Nie jestem zadowolony z użycia String.split (regex) na przykład. GWT tłumaczy kod na JS, a następnie używa wyrażenia regularnego jako regex JS. Ale nie mogę użyć czegoś takiego jak Java Matcher lub Java Pattern. Ale potrzebowałbym ich do dopasowania grupowego.

Czy jest jakaś możliwość lub biblioteka?

Próbowałem Jakarta Regexp, ale miałem inne problemy, ponieważ GWT nie emuluje wszystkich metod Java SDK, z których korzysta ta biblioteka.

Chcę móc używać coś takiego po stronie klienta:

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

Odpowiedz

87

Ten sam kod za pomocą RegExp mogą być:

// 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

Czy jesteś pewien, że '<=' nie powinno być '<' w '<= matcher.getGroupCount()'? –

+0

@AndreyRegentov Tak. Sprawdziłem, a potem to naprawiłem. W tych klasach fajne jest to, że GWT dostarcza czystą wersję Java, więc nadal możemy przetestować ich użycie z JUnit. – PhiLho

3

Jeśli chcesz czystego roztworu GWT, nie jestem pewien, że można to zrobić. Ale jeśli chcesz używać JSNI, możesz użyć obiektu RegExp JavaScript, aby uzyskać dopasowane grupy i wszystko. Musisz nauczyć się JSNI dla obiektu GWT i JavaScript RegExp. Wydaje się, że

+0

Myślałem o tym, ale nie znalazłem tego fajnego rozwiązania. – ludwigm

0

zapewnia emulację java.util.regex.Pattern i przyjaciół. To nie wygląda kompletnie (w szczególności Matcher), ale może być dobrym początkiem.

Technika, której używają do podłączenia własnych implementacji klas Java po stronie klienta, to deklaracja <super-source> w module XML. Jest to wspomniane w dokumentach GWT, opis formatu XML modułu pod "Nadpisywanie implementacji jednego pakietu innym". Standardowe klasy JRE do tłumaczenia w GWT są emulowane w ten sam sposób.

+0

Witam, próbowałem tej biblioteki wcześniej. jest to dobre rozwiązanie dla braku emulacji JRe, ale w tym przypadku nie obsługuje grupowania. Brakuje metod. – ludwigm

32

GWT 2.1 ma teraz RegExp klasę, która może rozwiązać swój problem:

+1

Proponuję naprawić literówkę RexExp i umieścić link za RegExp zamiast wstawiać go. –

+1

Dzięki. Czy to jest lepsze? –

17

Odpowiedź ta obejmuje wszystkie wzorzec pasuje, a nie tylko jeden, jak w innych odpowiedzi tutaj:

Funkcja:

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

... i użycie próbki:

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

} 
+3

Masz absolutną rację. To jest brakujący element układanki. 10 razy dużo! – gor

Powiązane problemy