Регулярные выражения и GWT


81

Мои вопросы: есть ли хорошее решение для использования регулярных выражений в GWT?

Например, меня не устраивает использование String.split (regex). GWT переводит код в JS, а затем использует регулярное выражение как регулярное выражение JS. Но я не могу использовать что-то вроде Java Matcher или Java Pattern. Но они мне понадобятся для группового сопоставления.

Есть ли возможность или библиотека?

Я попробовал Jakarta Regexp, но у меня были другие проблемы, потому что GWT не эмулирует все методы Java SDK, которые использует эта библиотека.

Я хочу иметь возможность использовать что-то подобное на стороне клиента:

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

Ответы:


96

Тот же код с использованием RegExp может быть:

// 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
Вы уверены , что <=не должно быть <в <=matcher.getGroupCount()?
Андрей Регентов

@AndreyRegentov Да. Я проверил, а потом исправил. Что хорошо в этих классах, так это то, что GWT предоставляет чистую версию Java, поэтому мы все еще можем протестировать их использование с JUnit.
PhiLho

32

GWT 2.1 теперь имеет RegExpкласс, который может решить вашу проблему:


1
Я предлагаю исправить опечатку RexExp и поместить ссылку за RegExp, а не встраивать ее.
antony.trupe 01

19

Этот ответ охватывает ВСЕ совпадения шаблонов, а не только одно, как в других ответах здесь:

Функция:

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

... и пример использования:

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

}

3
В этом вы абсолютно правы. Это недостающий фрагмент головоломки. 10x много!
gor

3

Если вам нужно чистое решение GWT, я не уверен, что это возможно. Но если вы хотите использовать JSNI, вы можете использовать объект JavaScript RegExp для получения сопоставленных групп и всего остального. Вам нужно будет изучить JSNI для GWT и объект JavaScript RegExp.


я думал об этом, но я не нашел это хорошее решение
Людвигм

0

Библиотека GWTx, кажется, обеспечивает эмуляцию java.util.regex.Pattern и других. Это не выглядит законченным (в частности, Matcher), но может быть хорошим началом.

Метод, который они используют для подключения собственных реализаций классов Java к клиентской стороне, - это <super-source>объявление в модуле XML. Это упоминается в документации GWT, описание формата XML модуля в разделе «Замена одной реализации пакета другой». Стандартные переводимые классы JRE в GWT эмулируются таким же образом.


привет, я пробовал эту библиотеку раньше. это хорошее решение для отсутствия эмуляции JRe, но в данном случае оно не поддерживает группировку. Методы для этого отсутствуют.
ludwigm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.