Javascript使用哪种正则表达式算法用于正则表达式?

时间:2009-04-07 20:58:51

标签: javascript regex algorithm language-agnostic unix

我今天在两个不同的正则表达式算法上阅读this article

根据the article旧的Unix工具,如ed,sed,grep,egrep,awk和lex,所有人都在常规表达中使用所谓的Thompson NFA算法......

然而,像Java,Perl,PHP和Python这样的新工具都使用不同的算法来处理速度慢得多的正则表达式。

This article完全没有提到Javascript的正则表达式algorthim,(是的,我知道那里有各种各样的JS引擎)但是我想知道是否有人知道他们使用了哪些算法,如果可能那些算法应该换掉Thompson NFA。

3 个答案:

答案 0 :(得分:7)

虽然ECMA标准没有指定ECMAScript实现应该使用的算法,但标准要求ECMAScript正则表达式必须支持反向引用(\ 1,\ 2等)的事实排除了DFA和“Thompson NFA”的实施方式。

答案 1 :(得分:6)

Javascript ECMA语言描述并未强制要求正则表达式的特定实现,因此部分问题的格式不正确。您真的很想知道特定浏览器中的特定实现。

Perl / Python等使用较慢算法的原因是,定义的正则表达式语言不是真正的正则表达式。真正的正则表达式可以表示为有限状态机,但正则表达式的语言是无上下文的。这就是为什么时尚只是称它为“正则表达式”而不是谈论正则表达式。

更新

是的,实际上javascript正则表达式不是内容免费常规。考虑使用`{n,m}'的语法,即从 n m 接受的正则表达式的匹配。让 d 区别 d = | n-m |。语法意味着存在一个可接受的字符串 ux d w ,但字符串 ux k> d w 那不是。通过常规语言的泵浦引理,这不是常规语言。

(augh.Tinko纠正。)

答案 2 :(得分:3)

Perl使用memoized递归回溯搜索,并且在5.10中进行了一些改进,不再在perl -e '("a" x 100000) =~ /^(ab?)*$/;'上爆发。在我最近在OS X盒子上进行的测试中,即使在awk的算法应该更好的情况下,Perl 5.10也优于awk