繁体   English   中英

正则表达式正式文档

[英]Regular Expression formal documention

是否有关于如何实现自己的正则表达式库的正式文档? 现有正则表达式库的创建者的代码基于哪些正式文档(如果有)?

我已经编写(并放弃)了一个 javascript 解析器,包括正则表达式支持。 我基于 ECMAscript 定义,它本身使用 Perl5 正则表达式。 这是 ECMA 262,我使用的是 1999 年 12 月的第 3 版。(现在有一个更新的版本,我不知道它的正则表达式定义是否完整。)

任何关于自动机理论和/或编译器构造的好教科书,例如Hopcroft 和 Ullman ,都涵盖了正则表达式及其与有限状态自动机的关系,它们可以被编译成有限状态自动机。 一些关于自然语言处理的教科书也是如此,其中通常使用有限状态方法,例如Jurafsky 和 ​​Martin

(甚至Ullman 本人在 Coursera 上开设了门课程,但尚未宣布新课程。)

至于当前 RE 库基于什么文档的问题:关于像我引用的教科书和现有实现的教科书。 我知道的第一个 RE 实现是Ken Thompson 的 QED 版本中的一个,ca。 1967 年。不幸的是,QED 网站上的技术报告引用了很少的参考资料,而且没有一个与 RE/FA 理论相关。 我确信这些想法最终可以追溯到 1950 年代发展起来的 Kleene 的正则语言理论。

正则表达式之所以称为正则是因为这是它们所代表的状态机的属性。 简单地说,一个可能的实现可能使用只是表格的状态机。 正则表达式解析器将为正则表达式创建许多状态和转换,执行它会根据转换经历状态。

例如 /ab+/ 生成类似:

state \ next char:  a       b       $       *
[initial state]     goto 1  fail    fail    fail
1                   fail    goto 2  fail    fail
2                   fail    goto 2  match   fail

(其中 $ 是字符串的结尾,* 是任何其他字符)

我一直在寻找正则表达式,并发现了一个有趣的问题,据我所知,关于它们的问题:为什么正则表达式可以有指数级的运行时间?

根据链接的文章,接受的答案表明RegExp实现(也在 Perl 中使用)“有点”慢,并且它们有一个更快/更简单的算法,被许多优秀的旧 Unix 工具(如 grep)使用。

这个链接直接引到提到的文章: Regular Expression Matching Can Be Simple And Fast ,(第2部分,第3部分

如果它是实际的,你应该使用这个算法而不是 Perl 的算法来考虑它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM