JavaScript RegExp.test()返回false,即使它应该返回true

V-L*_*ght 18 html javascript regex jquery

问题:我得到一个AJAX响应(带换行符的JSON或明文).应通过RegEx检查每个响应项,以确定它是否与用户定义的模式匹配.

例:

Ajax响应(纯文本)

"Aldor
Aleph
Algae
Algo
Algol
Alma-0
Alphard
Altran"
Run Code Online (Sandbox Code Playgroud)

用户模式:

/^Alg/ig.test(responseItem)
Run Code Online (Sandbox Code Playgroud)

RegExp结果应如下所示:

Aldor   // false
Aleph   // false
Algae   // true
Algo    // true
Algol   // true
Alma-0  // false
Alphard // false
Altran  // false
Run Code Online (Sandbox Code Playgroud)

但每次我得到不同(和有点受欢迎)的结果......例如(/^alg/ig.test("Algo")=> false)

我的代码:

HTML

...
<form>
  <input id="in" />
</form>
<div id="x">
  Aldor
  Aleph
  Algae
  Algo
  Algol
  Alma-0
  Alphard
  Altran
</div><button id="checker">check!</button>
...
Run Code Online (Sandbox Code Playgroud)

JavaScript(jQuery 1.6.2)

$(function(){
    var $checker = $('#checker');

    $checker.click(function(ev){
        var inputFieldVal = $.trim($('#in').val());
        console.log(inputFieldVal); // Alg
        var regExpPattern = '^'+inputFieldVal,
            re = new RegExp(regExpPattern, 'igm');
        onsole.log(re); // /^Al/gim
        // Get text out of div#x
        var text = $('#x').text();
        // Trim and 'convert' to an array...
            text = $.trim(text).split('\n');
        console.log(text); // ["Aldor", "Aleph", "Algae", "Algo", "Algol", "Alma-0", "Alphard", "Altran"]

        for (var index=0, upper=text.length;index<upper;++index) {
            console.log(
               re.test(text[index]),
               text[index]
             );
        }
    });
})
Run Code Online (Sandbox Code Playgroud)

控制台输出:

/^Alg/ig =>应匹配每个以...开头的项目 Alg

false "Aldor"
false "Aleph"
true "Algae"
false "Algo" //Why ? O.o
true "Algol"
false "Alma-0"
false "Alphard"
false "Altran"
Run Code Online (Sandbox Code Playgroud)

/^Al/ig =>应匹配每个项目,因为每个项目都以 Al

true "Aldor"
false "Aleph" //Why ? O.o
true "Algae"
false "Algo" //Why ? O.o
true "Algol"
false "Alma-0" //Why ? O.o
true "Alphard"
false "Altran" //Why ? O.o
Run Code Online (Sandbox Code Playgroud)

有什么建议?

CMS*_*CMS 33

当您处理具有全局g标志的模式时,这是exec或测试方法显示的常见行为.

RegExp对象将跟踪lastIndex找到匹配的位置,然后在后续匹配时,它将从该开始lastIndex而不是从该开始0.

例如:

var re = /^a/g;
console.log(re.test("ab")); // true, lastIndex was 0
console.log(re.test("ab")); // false, lastIndex was 1
Run Code Online (Sandbox Code Playgroud)

g从您的模式中删除标记,因为您只查找单个匹配(您正在单独测试每一行).


Dar*_*arm 5

您必须删除全局标志“g”。