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

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

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


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

}

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.