最高半折刷qq各种业务和钻(家里人自己开的,尽管放心,大家多捧捧场)

sking7

导航

关于IE和firefox匹配正则的区别

//ie下
var re = /(0*)1/; 
var s='00000000000000000000000000001';
alert(s.match(re));//[00000000000000000000000000001,0000000000000000000000000000]
alert(re.test(s));//true
alert(s.match(re).index);//0

  匹配很正常。firefox匹配也正常

首先复习下match的用法

match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。

match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。

如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在stringObject 中的位置,input 属性声明的是对 stringObject 的引用。

但如果运行下面程序

IE下:

var re = /(0*)*1/; 
var s='00000000000000000000000000001';
alert(s.match(re));//[00000000000000000000000000001,]匹配出来的似乎是个空字串,也许是后面的*起作用。。所以括号里匹配后是个“”
alert(re.test(s));//true
alert(s.match(re).index);//0

firefox下:

00000000000000000000000000001,0000000000000000000000000000

true

0
var re = /0*(0*)1/; 
var s='00000000000000000000000000001';
alert(s.match(re));
alert(re.test(s));
alert(s.match(re).index);

 IE下:00000000000000000000000000001,firefox下:000000000000000000000000这会发现是有问题的。。。完全搞不懂IE是怎么个匹配算法。。(姑且认为:匹配相同项(都是0*),以第一次为准)

 从firefox表现来看,似乎是优先匹配。。

var re = /0*(0)1/; 
var s='00000000000000000000000000001';
alert(s.match(re));
alert(re.test(s));
alert(s.match(re).index);

 IE下:000000000000000000000000000000000000000000000000000001,0

var re = /(0*)(0*)(0*)1/; 
var s='00000000000000000000000000001';
alert(s.match(re));
alert(re.test(s));
alert(s.match(re).index);

打印都是:00000000000000000000000000001,0000000000000000000000000000,,

下面看下不能匹配的时候:

var re = /(0*)*1/; 
var s='0000000000000000000000000000';//这里变化
alert(s.match(re));
alert(re.test(s));

IE:卡死--》(漫长等待后)打印出null,--->(卡死后漫长等待)false

感觉IE里面递归操作时进入漫长循环。。

如果s长度缩短,IE也不会卡死。。

(未解决问题)

补充:

   1. var matchs = /^(a+)+$/.exec("aaaaaaaaaaaaaaaaaaaaaaaaaaaX");
   2. alert(matchs);

在IE,firefox卡死。。

http://www.laruence.com/2009/09/27/1123.html?cp=all#comments

具体原因的分析, 在master regular expression里面有提到过.

NFA和DFA的引擎是有区别的。js/perl/php/java/.net都是NFA引擎。
而DFA与NFA机制上的不同带来5个影响:
1. DFA对于文本串里的每一个字符只需扫描一次,比较快,但特性较少;NFA要翻来覆去吃字符、吐字符,速度慢,但是特性丰富,所以反而应用广泛,当今主要 的正则表达式引擎,如Perl、Ruby、Python的re模块、Java和.NET的regex库,都是NFA的。
2. 只有NFA才支持lazy和backreference(后向引用)等特性;
3. NFA急于邀功请赏,所以最左子正则式优先匹配成功,因此偶尔会错过最佳匹配结果;DFA则是“最长的左子正则式优先匹配成功”。
4. NFA缺省采用greedy量词(就是对于/.*/、/\w+/这样的“重复n”次的模式,以贪婪方式进行,尽可能匹配更多字符,直到不得以罢手为止),NFA会优先匹配量词。
5. NFA可能会陷入递归调用的陷阱而表现得性能极差。

backtracking(回朔)
当NFA发现自己吃多了,一个一个往回吐,边吐边找匹配,这个过程叫做backtracking。由于存在这个过程,在NFA匹配过程中,特别是在编写不合理的正则式匹配过程中,文本被反复扫描,效率损失是不小的。明白这个道理,对于写出高效的正则表达式很有帮助。

posted on 2011-10-19 10:28  G.N&K  阅读(731)  评论(0编辑  收藏  举报