为什么jquery正则表达式返回不同 - 每次都有不同的测试用例?

时间:2013-09-17 06:13:25

标签: javascript jquery regex

当使用Regexp for restrict将HTML实体输入文本区域时,我遇到了问题。

我使用这个Regexp - /<(.|\n)*?>/g;来限制HTML实体,它对我来说很好,但是当我声明全局变量并使用这个regexp时,它给了我不同的 - 不同的测试用例(真/假)时间。

有一个Jsfiddle - Try This

当你第一次点击“提交”按钮时,你会得到“真实”,第二次你得到相同内容的“假”。

任何人都能告诉我为什么我的正则表达式会返回不同的 - 每次在全局声明它时会有不同的测试用例吗?

感谢您的帮助...... !!!

2 个答案:

答案 0 :(得分:7)

这是因为您在RegExp上使用g标志。

如果您需要使用g,您可以在函数中定义正则表达式,以便每次都获得一个新的

function CheckContent(){
  var RegForRestrictHtmlTags2 = /<(.|\n)*?>/g;  
  $('#txtJobDesc').val("AAAAAAAA<fff>AAAAAA");
  alert(RegForRestrictHtmlTags2.test($('#txtJobDesc').val()));
}

使用g标记时,您可以使用.test在主题字符串中查找多个匹配项。对于每个唯一匹配,.test将继续返回true。一旦.test返回false,它将有效地“重置”到起始位置。

考虑这个简单的例子

> var re = /a/g;
undefined

> var str = 'aaaaab';
undefined

> re.test(str); // first a
true

> re.test(str); // second a
true

> re.test(str); // third a
true

> re.test(str); // fourth a
true

> re.test(str); // fifth a
true

> re.test(str); // no more a's; reset
false

> re.test(str); // back to first a
true

答案 1 :(得分:4)

问题是您在g字面上使用RegExp标记。解决方案是删除g标志。


根据RegExp.test()(强调我的)的文件:

  

exec一样(或与之结合使用),在同一个全局正则表达式实例上多次调用的test 将超过上一个匹配

第一次调用test后,lastIndex对象RegExp的{​​{1}}属性会更新。索引用作第二次调用/<(.|\n)*?>/g的偏移量。由于模式不再匹配,第二个调用返回testfalse重置为0.您可以在此{{3}中看到正在更改的正则表达式的lastIndex属性}}

删除lastIndex标志将导致引擎忽略g属性。

我在JSFiddle中详细描述了lastIndex的行为(RegExp.exec也是如此)。