作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个正则表达式如下:
var str="checkedchec ";
var patt=/.*(?:\w+|\S)*\s+(or|and|not|xnot|near|near\d+|onear|onear\d+|title\:|ingress\:|\?|\*|\^|sourceid\:|author\\:|url\:|country\:)\s+.*/i;
var newStr = str.split(patt);
var result=patt.test(str);
上面的正则表达式大部分工作正常,但是当我有一个超过 11 个字符的字符时,它会给出“表达式太复杂”,Mozilla firefox 除外。它在 IE 和 Chrome 上运行良好。
最佳答案
您的正则表达式遇到了 catastrophic backtracking .您可以在其中交替使用可以匹配相同内容的部分(例如,由 \w
匹配的每个字符也可以由 \S
匹配,并且由前面的 .*
) 因此正则表达式引擎必须在宣布失败之前尝试大量排列。例如,RegexBuddy 在正则表达式引擎执行 100 万步后中止匹配尝试,而 Firefox 显然也在做同样(明智的)事情。
你到底想做什么?
将正则表达式更改为
/.*\s+(or|and|not|xnot|near|near\d+|onear|onear\d+|title:|ingress:|\?|\*|\^|sourceid:|author:|url:|country:)\s+.*/i
大大加快了匹配速度(现在只有 408 步,直到正则表达式引擎可以宣布失败)。
关于javascript - Firefox 在针对正则表达式编译长词时抛出过于复杂的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7243313/
我是一名优秀的程序员,十分优秀!