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?
Asked
Active
Viewed 4.2k times
93
-
1Doesn't `[\s\S]` work? – Wiktor Stribiżew Dec 14 '16 at 19:46
-
1@WiktorStribiżew no, first of all it maches a single character, and with `*` quantifier it stops on EOL – Dima Ogurtsov Dec 14 '16 at 19:49
3 Answers
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
andb
chars:a[^ab\r]*b
- Any text between
START
and the closestSTOP
words:START[\s\S\r]*?STOP
START[^\r]*?STOP
START[\w\W]*?STOP
- Any text between the closest
START
andSTOP
words:START(?:(?!START)[\s\S\r])*?STOP
See a demo screenshot below:

Wiktor Stribiżew
- 607,720
- 39
- 448
- 563
-
3
-
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
-
-
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
-
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
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