正则表达式和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);
    }
} 

Answers:


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()吗?
Andrey Regentov

@AndreyRegentov是的。我检查了一下,然后解决了。这些类的优点是GWT提供了纯Java版本,因此我们仍然可以在JUnit中测试它们的用法。
PhiLho 2014年


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,则可以使用JavaScript的RegExp对象来获取匹配的组和全部。您将需要学习GWT和JavaScript RegExp对象的JSNI。


我考虑了一下,但没有找到一个很好的解决方案
路德维希姆

0

GWTx库似乎提供的java.util.regex.Pattern和朋友的仿真。它看起来并不完整(尤其是Matcher),但可能是一个不错的开始。

他们为客户端插入自己的Java类实现的技术是<super-source>模块XML中的声明。在GWT文档的模块XML格式说明中提到了“用另一个包替代另一个包实现”。GWT中的标准JRE可翻译类的仿真方式相同。


嗨,我以前尝试过这个图书馆。对于缺少JRe仿真,这是一个不错的解决方案,但是在这种情况下,它不支持分组。缺少此方法。
路德维希姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.