用javascript正则表达式

时间:2013-01-31 03:53:57

标签: javascript regex

我在java脚本中有以下代码

    var regexp = /\$[A-Z]+[0-9]+/g;
    for (var i = 0; i < 6; i++) {
        if (regexp.test("$A1")) {
            console.log("Matched");
        }
        else {
            console.log("Unmatched");
        }
    }

请在浏览器控制台上运行。它将打印替代匹配不匹配。任何人都可以说明原因。

4 个答案:

答案 0 :(得分:4)

在字符串上调用test后,匹配后将设置lastIndex指针。

Before:
$A1
^

After:
$A1
   ^

当它结束时,指针将被重置为字符串的开头。

您可以尝试'$ A1 $ A1',结果将是

Matched
Matched
Unmatched
...

此行为在15.10.6.2 ECMAScript Language Spec中定义。

  

步骤11.如果全球属实,   一个。使用参数“lastIndex”,e和true调用R的[[Put]]内部方法。

答案 1 :(得分:1)

我已将您的代码缩小到一个简单的示例:

var re = /a/g, // global expression to test for the occurrence of 'a'
s = 'aa';     // a string with multiple 'a'

> re.test(s)
  true
> re.lastIndex
  1
> re.test(s)
  true
> re.lastIndex
  2
> re.test(s)
  false
> re.lastIndex
  0

这只适用于全局正则表达式!

来自MDN documentation on .test()

  

exec(或与之结合使用)一样,在同一个全局正则表达式实例上多次调用的test将超过上一个匹配。

答案 2 :(得分:0)

这是因为您使用全局标记g,每次调用.test时,都会更新正则表达式对象的.lastIndex属性。

如果您不使用g标记,那么您可以看到不同的结果。

答案 3 :(得分:0)

第一行中的'g'不正确,您没有在此处执行替换,而是匹配,删除它,您将获得预期的行为。

var regexp = / \ $ [A-Z] + [0-9] + / g;应该是:var regexp = / \ $ [A-Z] + [0-9] + /