JavaScript中regexp的意外行为

JavaScript中regexp的意外行为,javascript,regex,debugging,Javascript,Regex,Debugging,我遇到过这种奇怪的行为: 我在一个断点上(变量不变)。在控制台上,您可以看到,每次我尝试对同一个不变变量“text”计算regexp方法时,都会得到相反的响应。这件事有什么解释吗 相关代码如下: this.singleRe = /<\$([\s\S]*?)>/g; while( this.singleRe.test( text ) ){ match = this.singleRe.exec( text ); result = "";

我遇到过这种奇怪的行为:

我在一个断点上(变量不变)。在控制台上,您可以看到,每次我尝试对同一个不变变量“text”计算regexp方法时,都会得到相反的响应。这件事有什么解释吗

相关代码如下:

this.singleRe = /<\$([\s\S]*?)>/g;    

while( this.singleRe.test( text ) ){
        match = this.singleRe.exec( text );

        result = "";

        if( match ){

            result = match[ 1 ].indexOf( "." ) != -1 ? eval( "obj." +  match[ 1 ] ) :  eval( "value." + match[ 1 ] );

        }

        text = text.replace( this.singleRe , result );

    }
this.singleRe=//g;
while(this.singleRe.test(text)){
匹配=this.singleRe.exec(文本);
结果=”;
如果(匹配){
结果=匹配[1]。indexOf(“.”!=-1?eval(“obj.”+match[1]):eval(“value.”+match[1]);
}
text=text.replace(this.singleRe,result);
}

将regex与
exec()
和全局标志-
g
一起使用时,光标每次都在变化,如下所示:

var re = /\w/g;
var s = 'Hello regex world!'

re.exec(s); // => ['H']
re.exec(s); // => ['e']
re.exec(s); // => ['l']
re.exec(s); // => ['l']
re.exec(s); // => ['o']
注意
g
标志!这意味着正则表达式将匹配多个事件,而不是一个

编辑


如果可能的话,我建议不要使用
regex.exec(string)
而使用
string.match(regex)
。这将产生一个事件数组,并且很容易检查该数组或对其进行迭代。

当您将regex与
exec()
和全局标志-
g
一起使用时,光标每次都在变化,如下所示:

var re = /\w/g;
var s = 'Hello regex world!'

re.exec(s); // => ['H']
re.exec(s); // => ['e']
re.exec(s); // => ['l']
re.exec(s); // => ['l']
re.exec(s); // => ['o']
注意
g
标志!这意味着正则表达式将匹配多个事件,而不是一个

编辑


如果可能的话,我建议不要使用
regex.exec(string)
而使用
string.match(regex)
。这将生成一个事件数组,并且很容易检查该数组或对其进行迭代。

请发布您的代码,包括正在使用的正则表达式和正在匹配的文本,好吗?从提供的屏幕截图中不清楚是什么原因造成了这种情况……您能否共享您的代码以及您使用的浏览器版本。您能否发布您的代码,包括正在使用的正则表达式和正在匹配的文本?从提供的屏幕截图中不清楚是什么导致了这种情况……请您分享您的代码,以及您使用的浏览器版本。这是一个多么美妙和简单的解释。它起作用了!非常感谢。当您执行
.exec()
时,您可以执行
string.match(regex)
,它将返回整个事件数组,这样您就可以更轻松地遍历数组并进行检查:)您也可以这样做:
var res;虽然(res=re.exec(s)){//对每个结果做些什么,也许可以添加到数组}
。这是一个多么美妙和简单的解释啊。它起作用了!非常感谢。当您执行
.exec()
时,您可以执行
string.match(regex)
,它将返回整个事件数组,这样您就可以更轻松地遍历数组并进行检查:)您也可以这样做:
var res;虽然(res=re.exec(s)){//对每个结果执行一些操作,但可以添加到数组}