是否有办法让Visual Studio跨越多行执行正则表达式替换(允许匹配跨越行边界)?我知道有很多编辑器可以做到这一点,但是似乎很奇怪这个功能被遗漏在Visual Studio中。我是不是漏了什么?
是否有办法让Visual Studio跨越多行执行正则表达式替换(允许匹配跨越行边界)?我知道有很多编辑器可以做到这一点,但是似乎很奇怪这个功能被遗漏在Visual Studio中。我是不是漏了什么?
Visual Studio 2013 中的正则表达式已经发生了变化。 https://msdn.microsoft.com/zh-cn/library/2k3te2cs(v=vs.120).aspx
要匹配跨越两行的表达式,现在的代码应该是:
StartOfExpression.*\r?\n.*EndOfExpression
使用 (.*\n)*?
来跳过表达式之间的零个或多个行。
start(.*\n)*?end
找到
start
two
three
end
?
是非贪婪操作符,用于尽可能少地跳过几行。
如果end
不是该行的第一个单词,请添加.*
以匹配额外的字符。 即:start(.*\n)*?.*end
可以找到
start
two
three
four end end
如果你只想替换到第一个end
,则需要添加另一个非贪婪操作符:start(.*\n)*?.*?end
。(?s)start.*end
。end
前面加上额外的问号,这样它就不会贪婪匹配了。例如:start(.*\n)*.*?end
。 - CAD bloke(?s)start.*?end
,或者 start(.*\n)*?.*?end
。 - Stephan Stamm(?s)
时有困难吗? - Stephan Stamm这在Visual Studio 2012中现在可行:
fooPatternToStart.*(.*\n)+?.*barPatternToEnd
观察如何使用 (.*\n)+?
跨多行进行非贪婪匹配。
fooPatternToStart
是你的起始行上的一些正则表达式模式,而 barPatternToEnd
是你要在另一行(可能是许多行)下查找的模式...
在这里找到示例。
简单而有效 :)
注:在 VS2012 之前,可用的模式为:fooPatternToStart.(.\n)+@.*barPatternToEnd
sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__
可以搜索sprintf
和__func__
之间的log
,谢谢!不过...它似乎会无限制地查找。如果有一种方法可以限制行数就好了。 - Gizmo注意:此答案使用的是 Visual Studio 2012 版本及以前版本中使用的正则表达式语法。在 VS 2013 及以后版本中,正则表达式语法已更改。
你可以在表达式中包含 \n
。例如,以下是我用于从自动生成的 SQL 脚本中“清除”非存储过程内容的正则表达式(它将匹配以包含“Object: ”行开头且不为“StoredProcedure”的内容块,然后匹配随后的行直到一个由单词“GO”组成的行):
/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n
非贪婪多行任意字符捕获,Visual Studio 2013+:
.*?\r?\n.*?
对于所有在搜索VS Code时来到这里的人,我使用以下代码匹配从script
到任何地方的内容,并且有2个换行符(不包括换行符):
script(.|\n)+?(?=\n\n)
将script
和\n\n
替换为它们之间的所有内容。
</label>.*\r?\n.*<div
中的\r?\n
是明显的回车换行符,而.*
则用于匹配可能的制表符/空格。 - Sam