Multi-line regular expressions in Visual Studio
Regular expressions have changed in Visual Studio 2013. https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx
To match an expression over two lines the code would now be:
StartOfExpression.*\r?\n.*EndOfExpression
Use the replace in files dialog Ctrl-Shift-H and the single line option (?s)
:
(?s)start.*end
finds
start
two
three
end
Singleline means: each file is treated as single line, dot .
matches newline \n
. Downside: you must use Find All and replace all, or replace by hand. Find next does not work.
For the non-modal dialog Ctrl-H and find next, use (.*\n)*
to match any number of lines:
start(.*\n)*.*end
Either way, you can replace your findings with multiple lines by inserting \n
.
This works today in Visual Studio 2012:
fooPatternToStart.*(.*\n)+?.*barPatternToEnd
See how the (.*\n)+?
part does the match across multiple lines, non-greedy.fooPatternToStart
is some regex pattern on your start line, while barPatternToEnd
is your pattern to find on another line below, possibly many lines below...
Example found here.
Simple and effective :)
Note: before VS2012, the pattern that worked was: fooPatternToStart.(.\n)+@.*barPatternToEnd
Note: this answer is using the regex syntax used in Visual Studio up to and including VS 2012. In VS 2013 and later, the regex syntax has changed.
You can include \n
in the expression. As an example, here is a regex that I use to "clean" auto-generated SQL scripts from anything that is not a stored procedure (it will match text blocks that start with a line containing "Object: " followed by something that is not "StoredProcedure", then matching the following lines up to a line consists of the word "GO"):
/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n
you may need to use \r\n at the end of your expression.