正则表达式不会在新行上回溯

Posted

技术标签:

【中文标题】正则表达式不会在新行上回溯【英文标题】:RegularExpression does not backtrack on new line 【发布时间】:2019-08-13 10:44:46 【问题描述】:

我试图检测不正确(过度)的类似代码

foo 
  bar 
      baz 

使用正则表达式,我发现了一个有趣的行为。

我使用的正则表达式是/^( *).+\n\1 3,/,在 VS Code(标准查找和替换对话框)中,它会触发所有内容的误报。同时在 javascript (Chrome 74) 中没有这样的行为。

更严格的正则表达式/^( *)\S.+\n\1 3,/ 可以正常工作,但我想知道为什么存在差异?是在 JavaScript 中换行后不回溯(这是我的疯狂猜测)还是 VS Code 专门处理空白字符,例如默认情况下不贪婪地匹配它们?

PS:IE 的工作方式与 Chrome 相同。

【问题讨论】:

我无法重现,请描述您如何测试正则表达式并发布您测试正则表达式所针对的 字符串文字 - 目前尚不清楚之前是否有任何 CR 字符LF。 Doesn't work in regex101。我添加了一个\r? 以防万一,但没有它就没有区别。在网站上尝试了所有口味的正则表达式。我没有要检查的 VS Code。 @VLAZ 在 regex101.com 上添加 \r? 没有意义:它不允许在测试字符串中使用 CR 字符。所有换行符都只存在于 LF 那里。 @WiktorStribiżew 啊,我不知道。谢谢。 @VLAZ 在该站点上使用 m 标志与 JS 和 VSCode 中的方式相同 【参考方案1】:

好的,看起来 VSCode 运行带有标志 im 的正则表达式。如果没有 m 标志,^ 只会匹配字符串的开头,而不是任何新行的开头。

顺便说一句JS doesn't support \A and \Z anchors;

【讨论】:

以上是关于正则表达式不会在新行上回溯的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式模式灾难性回溯

正则进阶之,回溯, (贪婪* 非贪婪+? 独占++)三种匹配量词

防止在正则表达式上回溯以查找非注释行(不以缩进的“#”开头)

正则表达式灾难性回溯

Go 正则表达式中没有灾难性的回溯吗?

这个正则表达式不应该发生灾难性的回溯