dk.brics.automaton
这个 Java 包包含一个带有 Unicode 字母表 (UTF16) 的 DFA/NFA(有限状态自动机)实现,并支持标准正则表达式操作(连接、联合、Kleene 星)和许多非标准操作(交集、补集、 等等。)
与许多其他自动机/regexp 包相比,这个包快速、紧凑,并实现了真正的、不受限制的常规操作。
它使用基于 Unicode 字符间隔的符号表示。
完整的源代码和文档在 BSD 许可下可用。
最新版本 1.12-3 于 2021 年 8 月 11 日发布。 (ChangeLog)
dk.brics.automaton 包由奥胡斯大学的 Anders Møller 开发,其中包括来自 Alexandar Bakic、Jodi Moran、Brandon Lee、David Lutterkort、John Gibson、Alex Meyer、Daniel Lowe、Harald Zauner、Dawid Weiss 的贡献、建议和错误报告 、罗伯特·缪尔、汉斯-马丁·阿多夫、戴尔·理查森、雅尼克·弗斯利、古斯塔夫·伦德、维克多·贝切特、阿斯特丽德·穆里尔·温贾·尤南、瓦伦丁·维斯托尔茨、西蒙·格雷格森和刘易斯·约翰·麦吉布尼。
经常问的问题
这个包是否使用与 Perl 或 java.util.regex 相同类型的“正则表达式”?
不。这个包使用确定性有限状态自动机 (DFA),与大多数其他基于非确定性自动机 (NFA) 的正则表达式包不同。这意味着:
这里使用的“正则表达式”的概念完全具有古老的正则语言的表达能力。
这个包支持诸如补码(~运算符)和交集(& 运算符)之类的操作。
*
运算符在数学上是 Kleene 星形运算符(即我们没有贪婪/不情愿/占有变体)。
模式匹配的时间是最佳的:一旦将正则表达式转换为自动机,检查它是否与表达式匹配的字符串长度需要线性时间 - 与表达式的复杂性无关。 (基于 NFA 的包使用回溯。)
不支持捕获组。
某些符号,例如 ^ 和 $,可能意味着超出您预期的其他含义。
你能举一个使用包做简单模式匹配的例子吗?
这是一个非常简单的示例,可以帮助您入门:
RegExp r = new RegExp("ab(c|d)*");
Automaton a = r.toAutomaton();
String s = "abcccdc";
System.out.println("Match: " + a.run(s)); // prints: true
这个包支持的正则表达式语法的描述在哪里?
在 javadoc 中查找 RegExp 类。 请注意,这可能与您习惯的语法不完全相同!
如何使用此包进行真正快速的模式匹配?
将您的自动机转换为 RunAutomaton。
如何在我的正则表达式中使用预构建的自动机,如 <URI>
?
使用 x.toAutomaton(new DatatypesAutomatonProvider()) 将表达式 x 转换为自动机。 这是预先构建的自动机的列表。
如何在出版物中引用 dk.brics.automaton?
使用此 BibTeX 条目。
为什么 […] 没有自动机操作?
因为目前还没有这个需求。
我如何报告错误或提出改进建议?
请使用 github 问题跟踪器,或发送电子邮件至 amoeller@cs.au.dk。
参考资料
https://www.brics.dk/automaton/