正则表达式不会在新行上回溯
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;
【讨论】:
以上是关于正则表达式不会在新行上回溯的主要内容,如果未能解决你的问题,请参考以下文章
正则进阶之,回溯, (贪婪* 非贪婪+? 独占++)三种匹配量词