假设我有一个正则表达式列表(从外部源读取 - 文件、数据库等)。我想检查字符串匹配这些正则表达式中的哪一个。
我可以创建遍历所有这些正则表达式并匹配它们,但列表可能很大,这是一个关键操作。
我可以将所有这些正则表达式组合成一个(在它们之间有 |),但问题是我只能识别第一个匹配的正则表达式,而不是全部。
另一个想法可能是为所有这些正则表达式创建一个自动机,并用相应的正则表达式的索引来标记最终状态。我正在查看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
如您所见,只有第一组匹配,而我看不到匹配其他两组的方法。
更多发现 - 使用上面的自动机库,问题将简化为:如果连接两个或多个自动机,如何识别最终状态与原始自动机中的哪一个对应?