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




regex (5)

Мои вопросы: есть ли хорошее решение использовать регулярное выражение в 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);
    }
} 

Answers

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


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

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


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


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

Функция:

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

}

private Singleton() { 
    if (Singleton.singleton != null) {
        throw new RuntimeException("Can't instantiate singleton twice");
    }
}

Еще одна вещь, которую вы должны посмотреть - это readResolve(..) , потому что ваш класс реализует Serialiable . Там вы должны вернуть существующий экземпляр.

Но самый простой способ использования синглонов - перечислить - вы не беспокоитесь об этом.





java regex gwt