Javascript NodeJS Regex将字符串中的4位数字与';或';话
我需要一年内的正则表达式字符串。模板是“年--“高或低”-级别” 我构建了这个正则表达式:/Year-\d{4}-\b(low | high)\b-level/gi; 在在线正则表达式测试器中,我的字符串通过了检查。示例代码:Javascript NodeJS Regex将字符串中的4位数字与';或';话,javascript,node.js,regex,Javascript,Node.js,Regex,我需要一年内的正则表达式字符串。模板是“年--“高或低”-级别” 我构建了这个正则表达式:/Year-\d{4}-\b(low | high)\b-level/gi; 在在线正则表达式测试器中,我的字符串通过了检查。示例代码: const template = /Year-\d{4}-\b(low|high)\b-level/gi; const txtArr = ['Year-2019-low-level', 'Year-2019-high-level', 'Year-low-level',
const template = /Year-\d{4}-\b(low|high)\b-level/gi;
const txtArr = ['Year-2019-low-level', 'Year-2019-high-level', 'Year-low-level', 'Year-high-level', 'Year-2018-low-level', 'Year-2018-low-level']
for (const s of txtArr) {
console.log(template.test(s), s);
}
我希望有2个示例字符串不能通过,但有4个应该通过。但是他们没有——只有两个人通过了。在浏览器控制台中,它们也不会通过。在FF和Chrome中试用。我不明白为什么。
另外,如果我复制了没有通过匹配的字符串,只需
console.log(template.test('Year-2018-low-level'), 'Year-2018-low-level');
它过去了!我只有一个想法:看起来在循环的每次迭代中,有些东西并没有在正则表达式中重置,它在内存中保留了一些东西,这就是不让匹配通过
另外,我甚至将必须通过测试的同一字符串复制到数组中,如下所示:
const txtArr = ['Year-2019-low-level', 'Year-2019-low-level', 'Year-2019-low-level', 'Year-2019-low-level', 'Year-2019-low-level', 'Year-2019-low-level']
结果是正确的。。。为什么?如何修复?我更改了您的正则表达式及其工作方式,使用此正则表达式:
const-template=/Year-\d{4}-(低|高)-级别/
另一种选择是使用
!!s、 匹配(模板)
而不是template.test
,因此不需要修改正则表达式
工作示例:
对这种奇怪行为的解释:
RegExp对象跟踪发生匹配的最后一个索引,
因此,在后续匹配中,它将从上次使用的索引开始,
而不是0
从这个StackOverflow问题:我在这里找到了一个解释: “这个故事的寓意是要小心像_reg.test(输入)这样的结构; 当_reg是全局正则表达式时。它将尝试从任何先前字符串中最后一个匹配的索引进行匹配。” 因此,问题来自处理
global
语句的方式
该博客的作者还描述了与您相同的问题:
“这是一个完全奇怪的例子。想象一下,一个javascript函数在for循环中返回一个基于正则表达式匹配的字符串数组。在FireFox中,它将返回其应有的项目数的一半。”
要避免此问题,您可以不使用global
关键字,或者在每次迭代时实例化一个新的正则表达式:
const txtArr = ['Year-2019-low-level', 'Year-2019-high-level', 'Year-low-level', 'Year-high-level', 'Year-2018-low-level', 'Year-2018-low-level']
for (const s of txtArr) {
console.log(/Year-\d{4}-\b(low|high)\b-level/gi.test(s), s);
}
这确实非常令人惊讶,特别是考虑到将
template.test
更改为/Year-\d{4}-\b(low | high)\b-level/gi.test
修复了问题……当您删除global
语句时,它也会起作用。所有的解释都是这样的。而且,“g”标志似乎使regex失败。