regex 将模式用作常量变量时出现意外的正则表达式测试结果[重复]

z4iuyo4d  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(109)

此问题已在此处有答案

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
cwxwcias

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(字符串的结尾)开始搜索这个字符串,并得出结论,搜索的字符串不存在。现在它重置,因为什么也没找到。

const patternGlobal = /^([01][0-9]|2[0-3]):[0-5][0-9]$/g
const pattern = /^([01][0-9]|2[0-3]):[0-5][0-9]$/

console.log('Using global instance:')
console.log(patternGlobal.test('12:34'))
console.log(patternGlobal.test('12:34'))
console.log(patternGlobal.test('12:34'))

console.log('Using non global instance:')
console.log(pattern.test('12:34'))
console.log(pattern.test('12:34'))
console.log(pattern.test('12:34'))

相关问题