Visual Studio中的多行正则表达式


87

有什么方法可以使Visual Studio在多行之间执行正则表达式替换(让匹配的跨行边界)?我知道我可以使用很多编辑器,但是对于Visual Studio却没有此功能,这似乎很奇怪。我想念什么吗?

Answers:


25

使用中的文件对话框中的替换Ctrl- Shift-H和单行选项(?s)

(?s)start.*end

发现

start
two
three
end

单行表示:将每个文件视为单行,点.匹配换行符\n。缺点:您必须使用“查找全部”并替换全部,或手动替换。查找下一个不起作用。

对于非模式对话框Ctrl-H并查找下一个,用于(.*\n)*匹配任意数量的行:

start(.*\n)*.*end

无论哪种方式,您都可以通过插入来用多行替换您的发现\n


这行得通,但是您想要额外的问号(在之前end),所以它不会贪心。即:start(.*\n)*.*?end
CAD bloke

4
贪婪版本会在start和之间匹配尽可能多的字符end。如果要查找下一个,请end使用非贪婪版本:(?s)start.*?endstart(.*\n)*?.*?end
斯蒂芬·斯塔姆

潜在用户注意:自Visual Studio 2013起不起作用。请参见Giles Roberts的答案。
相对

@relatively_random:使用时遇到麻烦了(?s)吗?
斯蒂芬·斯塔姆

是的,我做到了。它在新的VS版本上仍然对您有用吗?
相对

72

正则表达式已在Visual Studio 2013中更改。 https://msdn.microsoft.com/zh-CN/library/2k3te2cs(v=vs.120).aspx

为了匹配两行以上的表达式,代码现在为:

StartOfExpression.*\r?\n.*EndOfExpression


谢谢你,这完美的作品,</label>.*\r?\n.*<div这里\r?\n是明显的carriage_return-NEW_LINE和.*匹配可能的选项卡/空格
山姆

我收到错误消息“当前不支持文字'\ n'”
ELI7VH

@ ELI7VH我无法复制您的错误。您正在使用哪个版本的Visual Studio?
吉尔斯·罗伯茨

25

现在可以在Visual Studio 2012中使用:

fooPatternToStart.*(.*\n)+?.*barPatternToEnd

查看(.*\n)+?零件如何跨多行(非贪婪)进行匹配。
fooPatternToStart是您的开始行上的一些正则表达式模式,而barPatternToEnd您的模式是在下面的另一行上找到的,可能是下面的许多行...

这里找到示例。

简单有效:)

注意:VS2012之前,有效的模式是:fooPatternToStart.(.\n)+@.*barPatternToEnd


4
注意visual studio 2012使用与代码内相同的正则表达式引擎来查找/替换代码,因此上面的内容变为:fooPatternToStart。*(。* \ n)*?。* barPatternToEnd
Brent

@Brent:理所当然,VSTO的最新版本已解决了该问题。
woohoo

如果我想专门在开始和停止之间搜索文本怎么办?像这样?:编辑:sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__logsprintf和之间搜索__func__,谢谢!Tho ..它似乎正在寻求无限的可能性..如果只有一种方法来限制行数
Gizmo

19

注意:此答案使用的是Visual Studio VS 2012及更高版本中使用的regex语法。在VS 2013及更高版本中,regex语法已更改。

您可以\n在表达式中包括。举例来说,这是一个正则表达式,我可以使用它来从所有非存储过程中“清除”自动生成的SQL脚本(它将匹配以“ Object:”开头的文本块,然后是不包含该内容的文本块) “ StoredProcedure”,然后将以下各行匹配到由单词“ GO”组成的一行):

/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n

注意:行终止符取决于文件的格式,因此仅对Unix样式文本使用\ n,对于Mac样式文本使用\ r,对于Windows样式文本仅使用\ r \ n。
詹姆斯·威尔金斯

2
注意二:请确保您没有同时勾选“匹配整个单词”,否则将无法正常工作!
Ed Graham 2014年

1
您能否添加一条注释,说此答案仅适用于Visual Studio 2012及更早版本?
吉尔斯·罗伯茨

3

您可能需要在表达式的末尾使用\ r \ n。


1

非贪婪多行捕获任何字符,Visual Studio 2013+:

.*?\r?\n.*?

吉尔斯·罗伯茨的答案中的贪婪版本。


0

对于在搜索VS代码时来到这里的每个人,我使用它script使用2个换行符(不包括换行符)将任何内容匹配到任何地方:

script(.|\n)+?(?=\n\n)

替换script\n\n匹配它们之间的所有内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.