2009-07-21 28 views
73

我的问题是:在GWT中使用正则表达式是否有很好的解决方案?正则表达式和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); 
    } 
} 

回答

87

使用正则表达式相同的代码可能是:

// 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()`中`<=`不应该是`<? – 2013-12-23 11:14:38

3

如果你想要一个纯GWT的解决方案,我不知道这是可以做到。但是,如果您愿意使用JSNI,则可以使用JavaScript的RegExp对象来获取匹配的组和所有组。您需要为GWT和JavaScript RegExp对象学习JSNI。

+0

我想过,但我没有找到它一个很好的解决方案 – ludwigm 2009-07-22 22:31:38

0

GWTx library似乎提供了对java.util.regex.Pattern和好友的模拟。 它看起来并不完整(特别是Matcher),但可能是一个好的开始。

它们用于插入自己的客户端Java类实现的技术是模块XML中的<super-source>声明。它在GWT文档中提到,在“用另一个重写一个包实现”下的模块XML格式描述中提到。 GWT中的标准JRE可翻译类以相同的方式进行模拟。

+0

嗨我试过这个库之前。这是缺少JRe模拟的一个很好的解决方案,但在这种情况下,它不支持分组。这种方法缺失。 – ludwigm 2009-07-24 10:12:20

32

GWT 2.1现在有一个RegExp类,可能会解决你的问题:

+1

我建议修复RexExp错字,并将链接放在RegExp后面,而不是内联它。 – 2010-11-01 14:22:26

+1

谢谢。这是否更好? – 2010-11-02 00:12:30

17

这样的回答涵盖了所有模式匹配,而不是只有一个,在其他答案在这里:

功能:

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

}