原文:js 正则学习小记之NFA引擎

之前一直认为自己正则还不错,在看 次碳酸钴Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣。

 求抱大腿,求大神调教、

之前大致有个印象,正则有很多种引擎,但我根本不知道有哪些引擎。

今天在读《精通正则表达式》才发现有Traditional NFA,POSIX NFA 和 DFA (具体自己百度下吧)。
可用了这么久的正则,还不知道 js 属于哪一种呢。
在《精通正则表达式》里有个简单是方法检测属于哪一种。

用 /nfa|nfa not/ 去匹配 "nfa not"。
如果匹配结果是 'nfa',那这个就是Traditional NFA(传统型NFA)了。
如果是 'nfa not',那有可能是 POSIX NFA 也可能是 DFA。

那我们先来试试这个正则吧。

"nfa not".match(/nfa|nfa not/);

得到的结果是 nfa,那么可以确定 js 的引擎是 传统型NFA 了。

如果是 'nfa not',那么要进行下一步测试来确定到底是 POSIX NFA 还是 DFA。
/X(.+)+X/ 去匹配 "==XX============================="。
如果执行时间长,则是 NFA (Traditional NFA在上一步已经可以确定了)。
如果执行时间短,基本就是DFA,也可能是高级优化的NFA。
另外,如果执行时溢出,超时,那也可以肯定是 NFA 了。

我们来试试这个吧,

console.time('/X(.+)+X/ test');
"==XX=============================".match(/X(.+)+X/);
console.timeEnd('/X(.+)+X/ test');

/X(.+)+X/ test: 17300.000ms
天哪,一个小小的正则竟然匹配了17秒,我吓尿了。(这个结果跟电脑配置有关系,你的神机也许比我快N倍)

当然现在我还解释不了,只能先告诉你这个貌似是 NFA 引擎的回溯失控导致的。
所以才能用这个方法检测 NFA 和 DFA 了。

NFA 是 表达式主导引擎,DFA 则是 文本主导引擎,而我们已经得知了js是传统型NFA,那么之后我们就围绕这NFA深入学习了。

今天的分享就是这些了,我要去修炼了,明天继续分享。

js 正则学习小记之NFA引擎的更多相关文章

  1. js 正则学习小记之左最长规则

    原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...

  2. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  3. js 正则学习小记之匹配字符串优化篇

    原文:js 正则学习小记之匹配字符串优化篇 昨天在<js 正则学习小记之匹配字符串>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯 ...

  4. js 正则学习小记之匹配字符串字面量优化篇

    昨天在<js 正则学习小记之匹配字符串字面量>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯后用 [^"] 才能匹配成功 ...

  5. js 正则学习小记之匹配字符串字面量

    今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) va ...

  6. js正则学习

    一直对正则很纠结也很畏惧,以前感觉花时间理解一个个奇奇怪怪的符号,还不如直接百度谷歌之. 但知其然不知其所以然也是种痛苦,所以花了两天稍微学了一下,虽然没学很深入彻底,但也比之前进步不少,特此笔记. ...

  7. js正则学习分享

    http://www.cnblogs.com/rubylouvre/archive/2010/03/09/1681222.html http://www.cnblogs.com/tylerdonet/ ...

  8. js正则学习及一些正则集合

    正则中文版详细说明请看中文版w3cschool-----http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp微软正则表达式语言-快速参考:http ...

  9. js正则学习小计

    //元字符 {} () ^ $ . ? + //预定义字符 \d \D \w \W \s \S //量词 {n,m} {n} {n,} + ? * //贪婪和惰性 //反向引用 //分组 //候选 / ...

随机推荐

  1. Gradle 1.12 翻译——第十六章. 使用文件

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

  2. Android 浏览器开发WebView setBlockNetworkImage本末

    含义本身防止网络数据图片 webSettings.setBlockNetworkImage(true); 停止发布数据 webSettings.setBlockNetworkImage(false); ...

  3. [渣译文] SignalR 2.0 系列: SignalR 自托管主机

    原文:[渣译文] SignalR 2.0 系列: SignalR 自托管主机 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...

  4. Visual Studio中开发

    如何在Visual Studio中开发自己的代码生成器插件    Visual Studio是美国微软公司开发的一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具.代 ...

  5. SQL Server 2005,2008 正则表达式 替换函数应用详解

    CREATE function dbo.regexReplace ( @source ntext, --原字符串 ), --正则表达式 ), --替换值 , --是否是全局替换 --是否忽略大小写 ) ...

  6. 【原创】构建高性能ASP.NET站点之一 剖析页面的处理过程(前端)

    原文:[原创]构建高性能ASP.NET站点之一 剖析页面的处理过程(前端) 构建高性能ASP.NET站点之一 剖析页面的处理过程(前端) 前言:在对ASP.NET网站进行优化的时候,往往不是只是懂得A ...

  7. [Android] App在三星某些机子上闪退:"不保留活动"

    今天遇到用户反映应用总是闪退. 现象:在MainActivity后,只要进入任何主进程相关的二级界面,都会导致应用闪退(注:不是崩溃引起的,只是闪退) 分析:1.看log日志,退出前有抛出异常,但查看 ...

  8. Effective Java (7) - 避免终止方法

    一. 基本概念 1. 所谓的终结方法事实上是指finalize(). 2. Java的垃圾回收机制仅仅负责内存相关清理.其它资源的清理(释放文件.释放DB连接)须要程序猿手动完毕. 3. 调用Syst ...

  9. 进口fbx角色动画read-only解

    原文链接:http://answers.unity3d.com/questions/8172/how-to-add-new-curves-or-animation-events-to-an-im.ht ...

  10. HTML与XHTML差额

    实际上.XHTML 与 HTML 4.01 标准没有太多的不同. 它们最基本的不同.举例说明例如以下: 1.XHTML 元素必须被正确地嵌套. 错误:<p><span>this ...