我可以遍历所有这些正则表达式并进行匹配,但列表可能很大,这是一个关键操作。
我可以将所有这些正则表达式合并为一个(用|分隔),但问题是我只能识别第一个匹配的正则表达式,而无法得到全部匹配的结果。
另一个想法是为所有这些正则表达式创建一个自动机,并使用相应正则表达式的索引标记最终状态。我看了一下http://cs.au.dk/~amoeller/automaton/,这个库似乎能够处理正则表达式和自动机,但不确定它是否可以扩展来解决我的问题。
你还有其他想法吗?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternTest {
public static void main(String[] args) {
Pattern p = Pattern.compile("(a(?:b|c)a)|((?:a|b)ba)|(ab(?:a|c))");
Matcher m = p.matcher("aba");
System.out.println(m.matches());
System.out.println(m.groupCount());
for (int i = 0, n = m.groupCount(); i < n; i++) {
System.out.println(m.group(i));
}
}
}
将会打印出
true
3
aba
aba
null
正如您所看到的,只有第一组匹配成功,我没有找到一种方法来匹配另外两个。
更多发现 - 使用上述的自动机库,问题将归结为以下:如果将两个或多个自动机串联起来,如何确定最终状态对应于哪个原始自动机?
X
)的末尾添加例如(?{ $matched{X} = 1 })(?!)
。这将标记表达式X
为匹配,并失败匹配,允许其他表达式也进行匹配。(为了优化它,你还可以将每个表达式放入一个原子捕获组中。) - Qtax