求解该正则表达式是如何浪费浏览器的时间的(匹配不可能成功的): http://jsfiddle.net/ioioio/F2zQP/2/ - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
jakwings
V2EX    Javascript

求解该正则表达式是如何浪费浏览器的时间的(匹配不可能成功的): http://jsfiddle.net/ioioio/F2zQP/2/

  •  
  •   jakwings 2014 年 2 月 20 日 3505 次点击
    这是一个创建于 4366 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Safari 的正则引擎竟然如此不同,正常通过?Chrome 和 Firefox 的正则引擎到底干了什么好事?

    假如是 NFA 类型的正则引擎,匹配的时间复杂度不是应该为 O(n^2) 的么?
    第 1 条附言    2014 年 2 月 21 日
    貌似已解决,原因见 8 楼。
    13 条回复    1970-01-01 08:00:00 +08:00
    momou
        1
    momou  
       2014 年 2 月 20 日
    不要用直接量语法试一下
    jakwings
        2
    jakwings  
    OP
       2014 年 2 月 21 日
    @momou 改成 /^ {4}[^\n]*(?:\n {4}[^\n]*\n?)*$/ 倒是很快的。但是就是不明白为什么原来的会那么慢(Safari 除外)……
    jakwings
        3
    jakwings  
    OP
       2014 年 2 月 21 日
    @jakwings 说错了,改成 /^ {4}[^\n]*(?:\n {4}[^\n]*)*\n?$/ 才是等效的。
    zzNucker
        4
    zzNucker  
       2014 年 2 月 21 日   1
    没那么简单,典型的回溯失控。 你最后的那个末尾匹配符匹配不到的话会从后往前反复逐个匹配,加上前面你的空格又只匹配掉4个,后面就有一大堆字符等着你去反复比较。。。
    zzNucker
        5
    zzNucker  
       2014 年 2 月 21 日
    你可以试试把4改大一点或者把末尾匹配去掉。。。
    momou
        6
    momou  
       2014 年 2 月 21 日
    var regex = new RegExp("/^(?: {4}[^\n]*\n?)+$/");不会有问题
    应该是字符被转义了吧
    zzNucker
        7
    zzNucker  
       2014 年 2 月 21 日
    @momou new regexp 里面不要加定界符了。
    jakwings
        8
    jakwings  
    OP
       2014 年 2 月 21 日
    @zzNucker 呃,我好像明白了,时间复杂度似乎比 O(n^2) 还高……

    重复匹配本身的复杂度就是 O(n^2) ,然后它的每一次重复中的子匹配过程也是 O(n^2) 复杂度,于是复杂度是 O(n^4) ……看来 Safari 的正则引擎干了一些特别的预测。
    zzNucker
        9
    zzNucker  
       2014 年 2 月 21 日
    @jakwings 对,尤其像你这种里面又有局部能匹配的,最后又整体不能成功的,就在里面反复找来找去,非常耗时间。
    lyric
        10
    lyric  
       2014 年 2 月 21 日   1
    大多数动态语言的正则引擎实现为了支持向后引用,都超过了正则文法,因此都不是 NFA 实现

    详情可以参考这篇 Paper: http://swtch.com/~rsc/regexp/regexp1.html
    baocaixiong
        11
    baocaixiong  
       2014 年 2 月 21 日
    一不小心输入了100,浏览器挂了。。。。。
    baocaixiong
        12
    baocaixiong  
       2014 年 2 月 21 日
    cpu都跑满了。。。
    jakwings
        13
    jakwings  
    OP
       2014 年 2 月 22 日
    @lyric 谢了,那个大神的文章很不错~实在是值得收藏啊。

    文章里的正则测试 Chrome 还是得用好几秒,Safari 和 Firefox 都瞬间搞定了,看来 Chrome 的正则引擎的优化还不怎么聪明。Safari 的貌似是优化得最好的。Firefox 的「优化」则往往是直接抛出 InternalError ……
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4674 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 06:37 PVG 14:37 LAX 22:37 JFK 01:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86