正则表达式未返回一致的结果

时间:2019-09-26 16:20:04

标签: javascript regex

我有一个切成句的split数组,但是我针对每个“单词”测试的正则表达式似乎不一致。

function test (reg) {
  const tags = [];
  const split = ["man", "man"];

  console.log(split)
  split.forEach((word, key) => {
    console.log(key)
    if (reg.test(word)) {
      console.info('Word:', word)
      tags.push(word)
    } else {
      console.log('Not word:', word)
    }
  })
}

const pathRegex = new RegExp(/^[A-ZÀ-Ýa-zà-ý0-9_]+[^.#$?\[\]]$/g);
const pathRegex2 = new RegExp(/^[0-9a-zA-Z/-]+[^.#$?\[\]]$/g);

console.log('test 1:')
test(pathRegex)
console.log('test 2:')
test(pathRegex2)

请参阅:https://codepen.io/TrySpace/pen/VwZNPLV?editors=1112

输出:

0
Word: man
1
Not word: man

我在这里想念什么?

我希望RegExp.test每次都返回相同的结果。

我注意到的是,当我将reg替换为new RegExp(/^[A-ZÀ-Ýa-zà-ý0-9_]+[^.#$?\[\]]$/g)时,它将给我预期的结果。

问题是为什么?

1 个答案:

答案 0 :(得分:4)

您的通知是正确的。使用g修饰符的正则表达式将跟踪lastIndex发生匹配的位置的问题。 因此,我们可以说它们在这种情况下是有状态的。

您可以传递字符串表达式并在函数中创建RegExp对象。

或应用dirty hack并手动重置lastIndex

reg.lastIndex = 0;