此问题已在此处有答案:
Why does a RegExp with global flag give wrong results?(7个回答)
Why is Javascript Regex matching every second time?(5个答案)
2天前关闭。
我正在尝试用正则表达式检查小时和分钟字符串。我使用的模式是可行的。当我直接使用该模式时,一切正常。但是当我将模式设置为一个常量,并在同一个字符串上多次使用该常量时,结果是从true来回跳到false。
我肯定漏掉了正则表达式定义中的一些重要部分。有没有一种方法可以将某种模式用作常量?
谢谢你,谢谢
验证码:
console.log(/^([01][0-9]|2[0-3]):[0-5][0-9]$/g.test('12:34'))
console.log(/^([01][0-9]|2[0-3]):[0-5][0-9]$/g.test('12:34'))
console.log(/^([01][0-9]|2[0-3]):[0-5][0-9]$/g.test('12:34'))
console.log(/^([01][0-9]|2[0-3]):[0-5][0-9]$/g.test('12:34'))
const pattern = /^([01][0-9]|2[0-3]):[0-5][0-9]$/g
console.log('Using variable:')
console.log(pattern.test('12:34'))
console.log(pattern.test('12:34'))
console.log(pattern.test('12:34'))
console.log(pattern.test('12:34'))
结果应该全部为真(8次)。但结果是:
true
true
true
true
Using variable:
true
false
true
false
1条答案
按热度按时间cwxwcias1#
这种行为并不意外,只是一个奇怪的选择。
正如你在docs中看到的:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
当JavaScript RegExp对象设置了全局或粘性标志(例如,/foo/g或/foo/y)时,它们是有状态的。它们存储上一个匹配的lastIndex。在内部使用这个方法,test()可以用来覆盖一个文本字符串中的多个匹配(带有捕获组)。
所以只要你使用'g'标志,regexp就会保持它的状态并继续解析输入,从而导致这种行为。
正则表达式第一次尝试从位置0测试sting
12:34
,以便找到匹配并在位置4结束。如果你现在再次传递这个字符串,它将从相同的位置4(字符串的结尾)开始搜索这个字符串,并得出结论,搜索的字符串不存在。现在它重置,因为什么也没找到。