Wyrażenia regularne i GWT

81

Moje pytanie brzmi: czy istnieje dobre rozwiązanie używania wyrażeń regularnych w GWT?

Na przykład nie jestem zadowolony z użycia String.split (regex). GWT tłumaczy kod na JS, a następnie używa wyrażenia regularnego jako wyrażenia regularnego JS. Ale nie mogę użyć czegoś takiego jak Java Matcher lub Java Pattern. Ale potrzebowałbym ich do dopasowywania 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, których używa ta biblioteka.

Chcę móc używać czegoś 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);
    }
} 
ludwigm
źródło

Odpowiedzi:

96

Ten sam kod przy użyciu RegExp mógłby wyglądać następująco:

// 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
źródło
2
Czy jesteś pewien, że <=nie powinno być <w <=matcher.getGroupCount()?
Andrey Regentov
@AndreyRegentov Yes. Sprawdziłem, a potem naprawiłem. Fajne w tych klasach jest to, że GWT dostarcza czystą wersję Java, więc nadal możemy przetestować ich użycie z JUnit.
PhiLho
32

GWT 2.1 ma teraz RegExpklasę, która może rozwiązać twój problem:

Philippe Beaudoin
źródło
1
Sugeruję poprawienie literówki w RexExp i umieszczenie linku za RegExp zamiast wbudowanego.
antony.trupe
19

Ta odpowiedź obejmuje WSZYSTKIE dopasowania wzorców, nie tylko jedno, jak w innych odpowiedziach tutaj:

Funkcjonować:

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 przykładowe zastosowanie:

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.
źródło
3
Masz absolutną rację w tej sprawie. To brakujący element układanki. 10x dużo!
gor
3

Jeśli chcesz czystego rozwiązania GWT, nie jestem pewien, czy 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.

Zburzyć
źródło
Myślałem o tym, ale nie znalazłem tego miłego rozwiązania
ludwigm
0

Biblioteka GWTx wydaje się stanowić emulację java.util.regex.Pattern i przyjaciół. Nie wygląda na kompletne (w szczególności Matcher), ale może być dobrym początkiem.

Technika, której używają do podłączania własnych implementacji klas Javy po stronie klienta, to <super-source>deklaracja w module XML. Wspomina się o tym w dokumentacji GWT, opisie formatu XML modułu w sekcji „Zastępowanie jednej implementacji pakietu inną”. Standardowe klasy do tłumaczenia JRE w GWT są emulowane w ten sam sposób.


źródło
cześć, próbowałem wcześniej tej biblioteki. jest to dobre rozwiązanie dla brakującej emulacji JRe, ale w tym przypadku nie obsługuje grupowania. Brakuje na to metod.
ludwigm