首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript RegExp.test()返回false,尽管它应该返回true

JavaScript RegExp.test()返回false,尽管它应该返回true
EN

Stack Overflow用户
提问于 2011-07-31 18:49:42
回答 4查看 15.3K关注 0票数 25

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

示例:

Ajax响应(纯文本)

代码语言:javascript
复制
"Aldor
Aleph
Algae
Algo
Algol
Alma-0
Alphard
Altran"

用户模式:

代码语言:javascript
复制
/^Alg/ig.test(responseItem)

RegExp结果应该如下所示:

代码语言:javascript
复制
Aldor   // false
Aleph   // false
Algae   // true
Algo    // true
Algol   // true
Alma-0  // false
Alphard // false
Altran  // false

但每次我得到不同的结果.(/^alg/ig.test("Algo") => false)

我的代码:

代码语言:javascript
复制
...
<form>
  <input id="in" />
</form>
<div id="x">
  Aldor
  Aleph
  Algae
  Algo
  Algol
  Alma-0
  Alphard
  Altran
</div><button id="checker">check!</button>
...

JavaScript (jQuery 1.6.2)

代码语言:javascript
复制
$(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]
             );
        }
    });
})

控制台输出:

/^Alg/ig =>应该匹配以Alg开头的每一项

代码语言:javascript
复制
false "Aldor"
false "Aleph"
true "Algae"
false "Algo" //Why ? O.o
true "Algol"
false "Alma-0"
false "Alphard"
false "Altran"

/^Al/ig =>应该匹配每一项,因为每一项都以Al开头

代码语言:javascript
复制
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

有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-31 19:10:46

这是执行或测试方法在处理具有全局g标志的模式时显示的常见行为。

RegExp对象将跟踪找到匹配的lastIndex,然后在随后的匹配中,它将从该lastIndex开始,而不是从0开始。

例如:

代码语言:javascript
复制
var re = /^a/g;
console.log(re.test("ab")); // true, lastIndex was 0
console.log(re.test("ab")); // false, lastIndex was 1

从您的模式中删除g标志,因为您只是在寻找单个匹配(您正在分别测试每一行)。

票数 65
EN

Stack Overflow用户

发布于 2011-07-31 19:13:29

您必须移除全局标志"g“。

票数 5
EN

Stack Overflow用户

发布于 2011-07-31 19:04:10

试试这个~

代码语言:javascript
复制
var str = "Aldor\rAleph\rAlgae\rAlgo\rAlgol";
var myregexp = /^alg.*$/img;
var match = myregexp.exec(str);
while (match != null) {
    for (var i = 0; i < match.length; i++) {
        alert(match[i]);
    }
    match = myregexp.exec(str);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6891545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档