我有一些通过编程组装的大型正则表达式,就像这样:
(A)|(B)|(C)|...
每个子模式都在其捕获组中。当我得到一个匹配时,如何找出哪个组匹配,而不是线性测试每个group(i)
以查看它是否返回非空字符串?
我有一些通过编程组装的大型正则表达式,就像这样:
(A)|(B)|(C)|...
每个子模式都在其捕获组中。当我得到一个匹配时,如何找出哪个组匹配,而不是线性测试每个group(i)
以查看它是否返回非空字符串?
дҪ еҸҜд»ҘдҪҝз”ЁйқһжҚ•иҺ·з»„пјҢиҖҢдёҚжҳҜпјҡ
(A)|(B)|(C)|...
жӣҝжҚўдёә
((?:A)|(?:B)|(?:C))
йқһжҚ•иҺ·з»„(?:)е°ҶдёҚдјҡиў«еҢ…жӢ¬еңЁз»„и®Ўж•°дёӯпјҢдҪҶеҲҶж”Ҝзҡ„з»“жһңе°Ҷиў«жҚ•иҺ·еңЁеӨ–йғЁ()з»„дёӯгҖӮ
将你的正则表达式分成三部分:
String[] regexes = new String[] { "pattern1", "pattern2", "pattern3" };
for(int i = 0; i < regexes.length; i++) {
Pattern pattern = Pattern.compile(regexes[i]);
Matcher matcher = pattern.matcher(inputStr);
if(matcher.matches()) {
//process, optionally break out of loop
}
}
public int getMatchedGroupIndex(Matcher matcher) {
int index = -1;
for(int i = 0; i < matcher.groupCount(); i++) {
if(matcher.group(i) != null && matcher.group(i).trim().length() > 0) {
index = i;
}
}
return index;
}
另一种选择是:
for(int i = 0; i < matcher.groupCount(); i++) {
if(matcher.group(i) != null && matcher.group(i).trim().length() > 0) {
//process, optionally break out of loop
}
}
我认为你不能避免线性搜索,但是你可以通过使用start(int)
而不是group(int)
来使其更加高效。
static int getMatchedGroupIndex(Matcher m)
{
int index = -1;
for (int i = 1, n = m.groupCount(); i <= n; i++)
{
if ( (index = m.start(i)) != -1 )
{
break;
}
}
return index;
}
这种方式,不需要为每个组生成子字符串,只需查询代表其起始索引的int
值。