2

使用 Regexp 进行限制以将 HTML 实体输入到文本区域时,我遇到了一个问题。

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

有一个 Jsfiddle -试试这个

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

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

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

4

2 回答 2

7

这是因为您在gRegExp 上使用了标志。

如果你需要使用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
于 2013-09-17T06:19:12.597 回答
4

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


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

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

在第一次调用 之后,对象testlastIndex属性被更新。用作第二次调用的偏移量的索引。由于模式不再匹配,因此第二次调用返回并重置为 0。您可以在此JSFiddle中看到正则表达式的属性正在更改。RegExp/<(.|\n)*?>/gtestfalselastIndexlastIndex

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

我已经在这篇文章RegExp.exec中详细描述了(这也是相同的RegExp.text)的行为。

于 2013-09-17T06:19:32.293 回答