Visual Studio Code中的多行正则表达式

95

我无法找到一种方法来让正则表达式匹配停止在文件的末尾而不是行的末尾,在VS Code中如此?这是工具限制还是有一些我不知道的模式?


1
[\s\S] 不起作用吗? - Wiktor Stribiżew
1
@WiktorStribiżew 不,首先它匹配单个字符,并且使用 * 量词时会停在行尾。 - Dima Ogurtsov
4个回答

160

看起来CR与[\s\S]不匹配。在这个字符类中添加\r:

[\s\S\r]+

将匹配任何1个或多个字符。

其他经过验证的可行替代方法为[^\r]+[\w\W]+

如果您想使任何字符类匹配换行符,无论是正字符类还是负字符类,都需要在其中添加\r

示例

  • 在最接近的ab字符之间的任何文本:a[^ab\r]*b
  • START和最接近的STOP单词之间的任何文本:
    • START[\s\S\r]*?STOP
    • START[^\r]*?STOP
    • START[\w\W]*?STOP
  • 在最接近的STARTSTOP单词之间的任何文本:
    • START(?:(?!START)[\s\S\r])*?STOP

请参见下面的演示截图:

enter image description here


3
好的,没问题。尝试过使用 \n,忘记了 \r - Dima Ogurtsov
1
@AymericBouzyaybbyk 是的,我正在努力保持这个答案的最新状态,您可以查看答案修订历史记录。它曾经有一段时间无法工作,但开发人员已经修复了他们之前引入的错误。 - Wiktor Stribiżew
如何编写多行否定字符类? - Michael Johnston
1
@MichaelJohnston 换行符与\r/\n匹配。将其添加到否定字符类中可以借助于交替或模式重写来完成。在通用形式中,它可能看起来像(?:\r|[^pattern])*。我刚刚测试了一下,[^pattern\r]*也可以工作,尽管这看起来很奇怪。 - Wiktor Stribiżew
1
@WiktorStribiżew 看起来很奇怪,还有其他一些奇怪的事情...我认为问题出在如果您在正则表达式中使用\n,那么*[^]等就开始匹配换行符。 - Michael Johnston
当文件非常大时,\r或\n似乎无法正常工作。 - hrdom

13
匹配从aaa开始并以第一个bbb结束的多行文本块(懒惰限定符)。
aaa(.|\n)+?bbb

aaa开始,直到最后一个bbb,查找多行文本块。(贪婪限定符)

aaa(.|\n)+bbb

1
这很有帮助。简单易懂。管道符号救了场。 - embarker

1

如果您想从“中间”文本中排除某些字符,也可以这样做。这只会找到在“aaa”和“bbb”之间没有出现字符“c”的块:

aaa([^c]|\n)+?bbb

0
我发现自己试图删除HTML中的注释。
根据@genevieve-warren的答案,我想出了这个正则表达式,它可以删除HTML注释的块(多行),但保留条件注释。
<!--[^[if](.|\n)+?-->

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接