我有一个带有多个析取捕获组的正则表达式
(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;
}
}
}
答案 0 :(得分:1)
这取决于你的意思更快。您可以使用start(int)
代替group(int)
if(matcher.start(i) != -1){
如果您不需要该组的实际内容,那么尝试创建一个新的字符串对象来保存它是没有意义的。我怀疑你会注意到性能上的任何差异,但没有理由不这样做。
但你仍然需要编写相同数量的样板代码;没有办法解决这个问题。与大多数其他语言相比,Java的正则表达风格严重缺乏语法糖。
答案 1 :(得分:-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中的“组号”部分。