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

Why jquery regular expression return different - different test cases each time?

本文关键字:测试用例 返回 jquery 正则表达式 为什么      更新时间:2023-09-26

当使用正则表达式限制将HTML实体输入文本区域时,我遇到了一个问题。

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

有一个 Jsfiddle - 试试这个

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

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

感谢您的帮助!!

这是因为

您在正则表达式上使用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

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


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

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

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

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

我在这篇文章中详细描述了RegExp.exec的行为(对于RegExp.text也是如此)。