javascript - JS RegEx 即使应该匹配也不匹配

标签 javascript node.js regex

我正在编写一个 node.js 脚本来对大量屏幕截图进行分组。
我有两种不同的模式想要匹配:

/(?<date>\d{4}-\d{2}-\d{2}) (?<time>\d{2}_\d{2}_\d{2})(-| - )(?<window>.*?)(-| - )(?<index>\d{6})(?<extension>\.(png|jpg|jpeg))/g
/(?<date>\d{4}-\d{2}-\d{2}) (?<time>\d{2}_\d{2}_\d{2})(-| - )(?<window>.*?)(?<extension>\.(png|jpg|jpeg))/g
  1. '2017-08-31 18_57_42-shouldwork.png' 符合预期的第二个
  2. “2017-08-31 18_57_43-shouldwork.png”两者都不匹配
  3. “2017-08-31 18_57_42-shouldwork - Kopie.png”符合预期的第二个
  4. “2017-08-31 18_57_42-shouldwork2.png”不匹配
  5. '2019-03-09 11_11_09 - Shouldwork - 000003.png' 符合预期的第一个
  6. '2019-03-09 11_11_10 - Shouldwork - 000003.png' 匹配第二个
  7. “应该失败.png”与预期不匹配

这也是 fiddle ,你可以用我的代码看到它(减少到有问题的部分)https://jsfiddle.net/sfwr750n/
这是 regex101 https://regex101.com/r/dxGFNN/1 的链接

一开始我以为只是node.js的问题,但是Chrome也有同样的问题(没有尝试firefox,上次我检查它不支持命名组),更令人困惑的是regex101匹配所有内容正如预期的那样。

最佳答案

您的正则表达式使用 g 标志,这意味着它们保留状态。例如,您说过您的第二个字符串与您的任何一个表达式都不匹配,但它确实匹配,前提是表达式从头开始:

const rex = /(?<date>\d{4}-\d{2}-\d{2}) (?<time>\d{2}_\d{2}_\d{2})(-| - )(?<window>.*?)(?<extension>\.(png|jpg|jpeg))/g;
const str = "2017-08-31 18_57_43-shouldwork.png";
console.log(rex.exec(str)); // Works
console.log(rex.exec(str)); // Fails
.as-console-wrapper {
  max-height: 100% !important;
}

我建议您不要使用 g 标志,并且一定在开头和结尾使用 anchor ,以便匹配整个字符串。或者,如果您要在较大的文本 block 中查找这些字符串,请确保在开始搜索新的文本 block 时在正则表达式上设置 lastIndex = 0,这样就不会从之前中断的地方继续。

关于javascript - JS RegEx 即使应该匹配也不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55077796/

相关文章:

javascript - 使用默认值包装现有的 jquery 事件

javascript - Dotenv 无法覆盖键值对

JavaScript 正则表达式问题

regex - 在vim中自动斜线反斜线

javascript - htaccess 设置 js 过期

javascript - 执行源自 AJAX 加载的外部文件的脚本

javascript - 如何正确克隆 JavaScript 对象?

node.js - 有没有一种方法可以使用 Electron 日志在Electron应用程序中的console.log中记录所有内容?

node.js - npm 认为 Node 已经过时了,但事实并非如此

php - 正则表达式从 css 文件中删除行