Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS Regex将字符串中的4位数字与';或';话_Javascript_Node.js_Regex - Fatal编程技术网

Javascript NodeJS Regex将字符串中的4位数字与';或';话

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',

我需要一年内的正则表达式字符串。模板是“年--“高或低”-级别”

我构建了这个正则表达式:/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', '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失败。