93

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?

Dima Ogurtsov
  • 1,487
  • 1
  • 10
  • 18

3 Answers3

156

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

Wiktor Stribiżew
  • 607,720
  • 39
  • 448
  • 563
  • 3
    Yeah, that works, thanks. Tried `\n`, forgot about `\r` – Dima Ogurtsov Dec 14 '16 at 19:57
  • 1
    @AymericBouzyaybbyk Yes, I am trying to keep this answer up-to-date, you may check the [answer revision history](https://stackoverflow.com/posts/41151078/revisions). It did not work for some time, but the developers fixed the bug they introduced before. – Wiktor Stribiżew Jan 02 '19 at 13:41
  • how do I do a multiline negated character class? – Michael Johnston Feb 26 '19 at 22:39
  • 1
    @MichaelJohnston The linebreak is matched with `\r`/`\n`. Adding that to a negated character class can be done with the help of alternation, or pattern re-writing. In the generic form, it may look like `(?:\r|[^pattern])*`. I have just tested and `[^pattern\r]*` works, too, although this looks weird. – Wiktor Stribiżew Feb 26 '19 at 22:45
  • @WiktorStribiżew it does look weird, and there are some other weird things...I _think_ what's going on is if you use `\n` anywhere in the regex, `*` & `[^]` etc. start matching newlines. – Michael Johnston Mar 05 '19 at 18:04
  • When the file is very large, \r or \n doesn't seem to work. – hrdom Jul 19 '23 at 06:11
12

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
InSync
  • 4,851
  • 4
  • 8
  • 30
Hui Zheng
  • 2,394
  • 1
  • 14
  • 18
0

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