0

将全局标志设置为 true:

<script>
var str="I am really puzzled up";
var str1="Being puzzled is first step towards understanding";
var patt=new RegExp("puzzled","gi");
patt.exec(str);
alert(RegExp.$_);   //I am really puzzled up *[1]
patt.exec(str1);
alert(RegExp.$_);   //I am really puzzled up *[2]
patt.exec(str1);
alert(RegExp.$_);   //Being puzzled is first step towards understanding *[3]
</script>

不将全局标志设置为 true:

<script>
var str="I am really puzzled up";
var str1="Being puzzled is first step towards understanding";
var patt=new RegExp("puzzled","i");
patt.exec(str);
alert(RegExp.$_);   //I am really puzzled up 
patt.exec(str1);
alert(RegExp.$_);   //Being puzzled is first step towards understanding  
</script>

输出已通过评论显示

  • [1]-我对这个输出很满意
  • [2]-现在,当我已经将模式与其他一些字符串构造函数属性匹配时,仍然显示我第一个匹配的字符串
  • [3]-只有通过再次将模式与字符串匹配,我才能获得所需的结果。

为什么我必须使用patt.exec method两次才能通过构造函数属性更改更新结果?

问题 - 它仅在global模式true标志设置为时发生。如果未设置全局标志,则构造函数属性的结果更新第一次发生。

4

1 回答 1

3

效果如何RegExp.exec

当给定一个字符串时,RegExp.exec将:

  • 如果模式是全局的(有g标志),那么它将使用实例中的lastIndex属性并从指示的索引中搜索模式的字符串。这意味着不知道输入字符串。它只会以索引为起点并搜索字符串,无论字符串是否与之前的调用相同。RegExp RegExp.exec

    如果找到匹配项,它将返回一个包含匹配项的数组,并相应地更新RegExp 实例中的字段,如参考中所示。lastIndex将更新开始下一场比赛的位置。

    如果没有找到匹配,它会将 重置lastIndex为 0,并null作为调用的结果返回RegExp.exec

  • 如果模式不是全局的(g未设置标志),lastIndex则属性将被忽略。lastIndex无论属性如何,匹配始终从索引 0 开始。

要非常清楚:

  • RegExp 实例将存储开始下一个匹配的位置 ( lastIndex)、标志的状态 ( global, multiline, ignorecase) 和模式的文本 ( source)。

  • 的返回值RegExp.exec是一个存储匹配结果的数组。该数组还具有input存储输入字符串的index属性和存储匹配的基于 0 的索引的属性。

对象RegExp.$_属性RegExp

RegExp.$_不推荐使用RegExp object 上的property 和其他几个类似的属性。只需通过. 等效于由 .返回的数组中附加的属性。RegExp.exec$_inputRegExp.exec

var arr = pattern.exec(inputString);
if (arr !== null) {
    // Print to the console the whole input string that has a match
    console.log(arr.input); 
}

由于这些属性在RegExp对象上,因此当您使用多个RegExp实例时会非常混乱 - 您不知道这些属性是来自当前执行还是先前执行,例如在这种情况下。

从您得到的行为来看,似乎RegExp.$_RegExp.exec找到匹配时被修改,而在匹配失败时不会被修改(保留以前的值)RegExp.exec

行为说明

请阅读上面的部分以了解其工作原理的全貌。

我在原始代码中添加了一些关于幕后发生的事情的评论:

全局标志

var str="I am really puzzled up";
var str1="Being puzzled is first step towards understanding";

// Global pattern
var patt=new RegExp("puzzled","gi");

// From index 0 of str, found match at index 12
// RegExp.$_ is set to current input - str
// patt.lastIndex is set to index 19
patt.exec(str);
alert(RegExp.$_);   //I am really puzzled up *[1]

// From index 19 of str1, can't find any match
// Since no match is found, RegExp.$_'s value is not changed
// patt.lastIndex is set to 0
patt.exec(str1);
alert(RegExp.$_);   //I am really puzzled up *[2]

// Found index 0 of str1, found match at index 6
// RegExp.$_ is set to current input - str1
// patt.lastIndex is set to 13
patt.exec(str1);
alert(RegExp.$_);   //Being puzzled is first step towards understanding *[3]

没有全局标志

var str="I am really puzzled up";
var str1="Being puzzled is first step towards understanding";
// Not global
var patt=new RegExp("puzzled","i");

// From index 0 of str, found match at index 12
// RegExp.$_ is set to current input - str
patt.exec(str);
alert(RegExp.$_);   //I am really puzzled up

// From index 0 of str1, found match at index 6
// RegExp.$_ is set to current input - str1
patt.exec(str1);
alert(RegExp.$_);   //Being puzzled is first step towards understanding
于 2013-05-16T06:57:15.383 回答