我无法找到一种方法来让正则表达式匹配在 VS Code 中停止,而不是在行末,而是在文件末?这是工具限制还是存在某种我不知道的模式?
我发现自己正在尝试删除 HTML 中的注释。
根据@genevieve-warren的回答,我想出了这个正则表达式,它可以删除除条件注释之外的 HTML 注释块(多行):
<!--[^[if](.|\n)+?-->
如果您想从 \'in between\' 文本中排除某些字符,您也可以这样做。这只会找到字符 \'c\' 未出现在 \'aaa\' 和 \'bbb\' 之间的块:
aaa([^c]|\n)+?bbb
如果在 aaa(?:.+|\n)+?bbb 等内部使用 + 则效率会更高(如果在一行中匹配则会略有不同,例如 aaa bbb bbb 会与后者 bbb 匹配)
匹配从 aaa 第一个开始并以第一个结束的 bbb (惰性限定符)
aaa
bbb
aaa(.|\n)+?bbb
查找从 aaa 最后一个 bbb . 开始并结束的多行文本块(贪婪限定符)
aaa(.|\n)+bbb
@WiktorStribiżew 它看起来确实很奇怪,并且还有一些其他奇怪的事情......我认为发生的事情是如果你在正则表达式的任何地方使用 \n,*&[^]等就会开始匹配换行符。
@MichaelJohnston 换行符与 \r/\n 匹配。将其添加到否定字符类中可以借助交替或模式重写来完成。在通用形式中,它可能看起来像 (?:\r|[^pattern])*。我刚刚测试过,[^pattern\r]* 也可以工作,尽管这看起来很奇怪。
@AymericBouzyaybbyk 是的,我正在努力使这个答案保持最新,你可以查看答案修订历史。它有一段时间不起作用,但开发人员修复了他们之前引入的错误。
看来 CR 与 不匹配 [\s\S] 。添加 \r 到此字符类:
[\s\S]
\r
[\s\S\r]+
将匹配 任何 1+ 个字符。
其他被证明有效的替代方案 [^\r]+ 包括 [\w\W]+ .
[^\r]+
[\w\W]+
如果您想让任何字符类匹配换行符,无论是正字符类还是负字符类,您都需要添加 \r 它。
例如 :
a
b
a[^ab\r]*b
START
STOP
START[\s\S\r]*?STOP
START[^\r]*?STOP
START[\w\W]*?STOP
START(?:(?!START)[\s\S\r])*?STOP
请参阅下面的演示截图: