Dima Ogurtsov
Dima Ogurtsov

Reputation: 1617

Multi-line regular expressions in Visual Studio Code

I cannot figure a way to make regular expression match stop not on end of line, but on end of file in VS Code? Is it a tool limitation or there is some kind of pattern that I am not aware of?

Upvotes: 104

Views: 51496

Answers (4)

NeuronTI
NeuronTI

Reputation: 39

I found my self trying to remove comments in HTML.

Based on @genevieve-warren's answer I came up with this regex which removes blocks (multiline) of HTML comments except conditional comments:

<!--[^[if](.|\n)+?-->

Upvotes: 1

Hui Zheng
Hui Zheng

Reputation: 3097

To match a multi-line text block starting from aaa and ending with the first bbb (lazy qualifier)

aaa(.|\n)+?bbb

To find a multi-line text block starting from aaa and ending with the last bbb. (greedy qualifier)

aaa(.|\n)+bbb

Upvotes: 16

Genevieve Warren
Genevieve Warren

Reputation: 21

If you want to exclude certain characters from the "in between" text, you can do that too. This only finds blocks where the character "c" doesn't occur between "aaa" and "bbb":

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

Upvotes: 2

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626926

It seems the CR is not matched with [\s\S]. Add \r to this character class:

[\s\S\r]+

will match any 1+ chars.

Other alternatives that proved working are [^\r]+ and [\w\W]+.

If you want to make any character class match line breaks, be it a positive or negative character class, you need to add \r in it.

Examples:

  • Any text between the two closest a and b chars: a[^ab\r]*b
  • Any text between START and the closest STOP words:
    • START[\s\S\r]*?STOP
    • START[^\r]*?STOP
    • START[\w\W]*?STOP
  • Any text between the closest START and STOP words:
    • START(?:(?!START)[\s\S\r])*?STOP

See a demo screenshot below:

enter image description here

Upvotes: 176

Related Questions