有没有人遇到过类似于 Google 的正则表达式库 RE2 的 Java 版本,或者具有类似功能和良好性能的 Java 库?其性能要求是与正则表达式长度和输入文本长度成线性关系。
澄清
大多数正则表达式实现使用回溯算法来匹配输入文本,因此在某些简单正则表达式(例如 (.*).(.*).(.*).(.*)
)上指数级增长。RE2 是谷歌的一个库,通过使用自动机理论的概念,采用一种随着输入大小变化而变化的线性算法来解决这个问题。问者想知道是否存在基于这种算法的 Java 库。
有没有人遇到过类似于 Google 的正则表达式库 RE2 的 Java 版本,或者具有类似功能和良好性能的 Java 库?其性能要求是与正则表达式长度和输入文本长度成线性关系。
大多数正则表达式实现使用回溯算法来匹配输入文本,因此在某些简单正则表达式(例如 (.*).(.*).(.*).(.*)
)上指数级增长。RE2 是谷歌的一个库,通过使用自动机理论的概念,采用一种随着输入大小变化而变化的线性算法来解决这个问题。问者想知道是否存在基于这种算法的 Java 库。
这里有一个用于Java的有限状态自动机包:www.brics.dk/automaton;还可以参考这篇文章。下面是一个简单的示例:
RegExp r = new RegExp("ab(c|d)*");
Automaton a = r.toAutomaton();
String s = "abcccdc";
System.out.println("Match: " + a.run(s)); // prints: true
谷歌搜索结果如下:
https://github.com/logentries/re2-java
它仅支持64位Linux。
编辑: 我认为Alan Donovan给出的答案更好,因为Google已经发布了RE2的端口https://github.com/google/re2j