给定一个正则表达式(group1)|(group2)|(group3)|...|(groupn)
,这是不可能知道哪个组的文本,而无需通过至少(N - 1)去匹配组,检查其是否捕捉一些文字或者是null
。
但是,您可以通过调用Matcher.start(int group)
来减少字符串构造的开销,并检查返回的索引是否为负数(大于或等于0)。
顺便说一句,这是Matcher.group(int group)
甲骨文公司实现的源代码(版本8-B123):
public String group(int group) {
if (first < 0)
throw new IllegalStateException("No match found");
if (group < 0 || group > groupCount())
throw new IndexOutOfBoundsException("No group " + group);
if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
return null;
return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
}
而且随着Matcher.start(int group)
,也是Oracle的实现版本8-B123相比:
public int start(int group) {
if (first < 0)
throw new IllegalStateException("No match available");
if (group < 0 || group > groupCount())
throw new IndexOutOfBoundsException("No group " + group);
return groups[group * 2];
}
理论上,有可能知道哪个组matc通过检查O(log n)捕获组来查看文本。您可以通过为组1添加捕获组(组2)和组(n div 2 + 1)到组n来创建搜索树。这允许您通过跟随匹配的分支来搜索与文本匹配的组。不过,我建议不要这样做,因为逻辑非常复杂且容易出错(添加了较大的捕获组后,组号会发生变化,而组数不一定总是2的幂)。
+1和使用'Match.start'是一个很好的建议。 – 2014-11-06 09:42:51