RegExp测试方法中的"g"如何交替工作?

Aka*_*ava 5 javascript regex

http://jsfiddle.net/bpt33/

var t = "";

var a = ["atom-required","atom-label","atom-data-type","atom-regex"];

var r = /atom\-(label|required|regex|data\-type|class|is\-valid|field\-value|error)/i;

function test(a, r){
    for(var i = 0; i<a.length; i++){
        t += a[i] + " => " + r.test(a[i]) + "<br/>";
    }
}

test(a, r);

t += "<br/>";

a = ["atom-required","atom-label","atom-data-type","atom-regex"];

var r = /atom\-(label|required|regex|data\-type|class|is\-valid|field\-value|error)/gi;

test(a, r);

$("#results").get(0).innerHTML = t;
Run Code Online (Sandbox Code Playgroud)

如果未指定g,则它可以正常工作,

atom-required => true
atom-label => true
atom-data-type => true
atom-regex => true
Run Code Online (Sandbox Code Playgroud)

指定g时,它可以交替工作

atom-required => true
atom-label => false
atom-data-type => true
atom-regex => false
Run Code Online (Sandbox Code Playgroud)

小智 11

因为使用g修饰符,正则表达式变为有状态,并在最后一次匹配后继续在索引处进行下一次搜索.

如果未找到匹配项,则会自行重置.

您可以使用该.lastIndex属性观察起点.

r.lastIndex; // 0 or some higher index
Run Code Online (Sandbox Code Playgroud)

您可以通过将该属性设置为手动重置它0.

r.lastIndex = 0
Run Code Online (Sandbox Code Playgroud)

  • @ raina77ow:除非你想在循环中测试同一个字符串上的多个匹配项,否则在找到一定数量时停止测试. (2认同)