JS RegEx不匹配,即使它应该匹配

时间:2019-03-09 13:26:02

标签: 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-应该工作-000003.png'符合预期的第一名
  6. '2019-03-09 11_11_10-应该工作-000003.png'匹配第二名
  7. “ should fail.png” 与预期不符

在这里您也可以在我的代码中看到它(简化为有问题的部分)https://jsfiddle.net/sfwr750n/
这是regex101 https://regex101.com/r/dxGFNN/1

的链接

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

1 个答案:

答案 0 :(得分:2)

您的正则表达式使用async ngOnInit(){ const res = await this.es.getEventList(); console.log(JSON.stringify(res)); } 标志,这意味着它们保留状态。例如,您说过第二个字符串与您的两个表达式都不匹配,但前提是表达式从头开始:

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; }标志,并且 do 在开头和结尾都使用定位符,以便匹配整个字符串。另外,如果您要在较大的文本块中查找这些字符串,只需确保在开始搜索新的文本块时在正则表达式上设置g,这样就不会从先前的位置继续离开。