Adr*_*Ber 11 java regex automaton
假设我有一个正则表达式列表(从外部源读取 - 文件,数据库等).我想检查字符串匹配哪些正则表达式.
我可以通过所有这些正则表达式创建迭代并匹配它们,但列表可能是一个巨大的,这是一个关键的操作.
我可以将所有这些正则表达式合并为一个(在它们之间),但问题是我只能识别第一个匹配的正则表达式,而不是所有.
另一个想法可能是为所有这些正则表达式创建一个自动机,并用相应正则表达式的索引标记最终状态.我正在查看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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
将打印出来
true
3
aba
aba
null
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,只有第一组匹配,我没有找到匹配其他两组的方法.
更多发现 - 使用上面的自动机库,问题将减少到以下几点:如果连接两个或多个自动机,如何识别哪个原始自动机对应的最终状态?
小智 3
dk.brics.automaton不直接支持这一点,但您可以概括自动机的表示(以及相关的自动机操作)以区分不同类型的接受状态。例如,首先向State类添加一个 int 字段,并在设置“accept”时使用该字段。