使用pattern作为常量变量时出现意外的正则表达式测试结果

问题描述 投票:0回答:1

我正在尝试使用正则表达式检查小时和分钟字符串。我使用的模式是可行的。当我直接使用模式时,一切都可以。但是,当我将模式设置为常量,并在同一字符串上多次使用该常量时,结果会从 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
javascript node.js regex variables constants
1个回答
0
投票

这种行为并不意外,只是一个奇怪的选择。

正如您在文档中看到的:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test

JavaScript RegExp 对象在设置了全局或粘性标志(例如 /foo/g 或 /foo/y)时是有状态的。他们存储上一场比赛的lastIndex。在内部使用它, test() 可用于迭代文本字符串中的多个匹配项(带有捕获组)。

因此,只要您使用“g”标志,正则表达式就会保持其状态,从而导致此行为。

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 isntance:')
console.log(patternGlobal.test('12:34'))
console.log(patternGlobal.test('12:34'))
console.log(patternGlobal.test('12:34'))

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

© www.soinside.com 2019 - 2024. All rights reserved.