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?
4 Answers
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
aandbchars:a[^ab\r]*b - Any text between
STARTand the closestSTOPwords:START[\s\S\r]*?STOPSTART[^\r]*?STOPSTART[\w\W]*?STOP
- Any text between the closest
STARTandSTOPwords:START(?:(?!START)[\s\S\r])*?STOP
See a demo screenshot below:
6 Comments
Dima Ogurtsov
Yeah, that works, thanks. Tried
\n, forgot about \rWiktor Stribiżew
@AymericBouzyaybbyk Yes, I am trying to keep this answer up-to-date, you may check the answer revision history. It did not work for some time, but the developers fixed the bug they introduced before.
Michael Johnston
how do I do a multiline negated character class?
Wiktor Stribiżew
@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.Michael Johnston
@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. |
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
2 Comments
embarker
This is helpful. Simple and easy. pipe character saves the day.
bobble bubble
Could be much more efficient, if you used
+ inside like aaa(?:.+|\n)+?bbb (there is a slight difference if matching in one line e.g. aaa bbb bbb where it would match up to the latter bbb)
[\s\S]work?*quantifier it stops on EOL