我有一个切成句的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)
时,它将给我预期的结果。
问题是为什么?
答案 0 :(得分:4)
您的通知是正确的。使用g
修饰符的正则表达式将跟踪lastIndex
发生匹配的位置的问题。
因此,我们可以说它们在这种情况下是有状态的。
您可以传递字符串表达式并在函数中创建RegExp
对象。
或应用dirty hack
并手动重置lastIndex
:
reg.lastIndex = 0;