lee*_*d00 15 javascript regex language-agnostic unix algorithm
我今天在阅读这篇文章的两个不同的正则表达式算法.
根据文章旧的Unix工具,如ed,sed,grep,egrep,awk和lex,都在他们的常规表达中使用所谓的Thompson NFA算法......
然而,像Java,Perl,PHP和Python这样的新工具都使用不同的算法来处理速度慢得多的正则表达式.
这篇文章完全没有提到Javascript的regex algorthim,(并且我知道那里有各种各样的JS引擎)但是我想知道是否有人知道他们使用了哪些算法,以及是否应该将这些算法换成Thompson NFA.
Javascript ECMA语言描述并未强制要求正则表达式的特定实现,因此部分问题的格式不正确.您真的很想知道特定浏览器中的特定实现.
Perl/Python等使用较慢算法的原因是,定义的正则表达式语言不是真正的正则表达式.真正的正则表达式可以表示为有限状态机,但正则表达式的语言是无上下文的.这就是为什么时尚只是称它为"正则表达式"而不是谈论正则表达式.
是的,实际上javascript正则表达式不是免费的常规内容.考虑使用`{n,m}'的语法,即从n到m接受的正则表达式的匹配.设d差d = | nm |.语法意味着存在可接受的字符串ux d w,但字符串ux k> d w不是.通过常规语言的泵浦引理,这不是常规语言.
(听说Thinko纠正了.)
虽然ECMA标准没有规定ECMAScript实现应该使用的算法,但标准要求ECMAScript正则表达式必须支持反向引用(\ 1,\ 2等)的事实排除了DFA和"Thompson NFA"实现.