Регулярні вирази та GWT


81

Мої запитання: чи є хороше рішення для використання регулярних виразів у GWT?

Я не задоволений використанням String.split (регулярний вираз), наприклад. 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);
    }
} 

Відповіді:


97

Той самий код, що використовує 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

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
Ви абсолютно праві на цьому. Це відсутній шматок головоломки. 10 разів!
gor

3

Якщо ви хочете отримати чисте рішення GWT, я не впевнений, що це можна зробити. Але якщо ви бажаєте використовувати JSNI, ви можете використовувати об’єкт RegExp JavaScript, щоб отримати відповідні групи та все. Вам потрібно буде вивчити JSNI для об'єкта GWT та JavaScript RegExp.


Я думав про це, але не знайшов хорошого рішення
ludwigm

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.