RegExp构造函数属性输入

时间:2013-05-16 05:56:28

标签: javascript regex constructor exec

将全局标志设置为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时才会发生。如果未设置全局标志,则构造函数属性的更新结果将在第一次发生。

1 个答案:

答案 0 :(得分:3)

RegExp.exec如何运作?

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

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

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

    如果未找到匹配项,则会将lastIndex重置为0,并在调用null时返回RegExp.exec

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

非常清楚:

  • RegExp instance 将存储开始下一场比赛(lastIndex)的位置,旗帜的状态(global,{{1 },multiline)和模式的文本(ignorecase)。

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

index 对象的RegExp.$_属性

RegExp属性以及RegExp.$_ 对象 are deprecated上的其他几个类似属性。只需通过RegExp返回的数组访问它们。 RegExp.exec相当于$_返回的数组中附加的input属性。

RegExp.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]