0

我有一个带有多个分离捕获组的正则表达式

(a)|(b)|(c)|...

有没有比这更快的方法来访问第一个成功匹配的捕获组的索引?

(matcher 是 java.util.regex.Matcher 的一个实例)

int getCaptureGroup(Matcher matcher){
    for(int i = 1; i <= matcher.groupCount(); ++i){
        if(matcher.group(i) != null){
            return i;
        }
    }
}
4

2 回答 2

1

这取决于您所说的更快是什么意思。start(int)您可以通过使用而不是使代码更有效率group(int)

if(matcher.start(i) != -1){

如果您不需要组的实际内容,那么尝试创建一个新的字符串对象来保存它是没有意义的。我怀疑你会注意到性能上的任何差异,但没有理由这样做。

但是您仍然必须编写相同数量的样板代码;没有办法解决这个问题。与大多数其他语言相比,Java 的正则表达式风格严重缺乏语法糖。

于 2013-10-06T21:03:16.260 回答
-1

我猜模式是这样的:

if (matcher.find()) {
  String wholeMatch = matcher.group(0);
  String firstCaptureGroup = matcher.group(1);
  String secondCaptureGroup = matcher.group(2);
  //etc....
}

可能有不止一场比赛。因此,您可以使用 while 循环来遍历所有匹配项。

请查看java.util.regex.Pattern的 javadoc 中的“组号”部分。

于 2013-10-03T12:41:37.657 回答