【发布时间】:2010-10-25 17:38:58
【问题描述】:
有没有办法让 Visual Studio 跨多行执行正则表达式替换(让匹配跨越行边界)?我知道我可以使用很多编辑器,但奇怪的是这个功能被排除在 Visual Studio 之外。我错过了什么吗?
【问题讨论】:
标签: regex visual-studio
有没有办法让 Visual Studio 跨多行执行正则表达式替换(让匹配跨越行边界)?我知道我可以使用很多编辑器,但奇怪的是这个功能被排除在 Visual Studio 之外。我错过了什么吗?
【问题讨论】:
标签: regex visual-studio
Visual Studio 2013 中的正则表达式已更改。 https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx
要匹配两行以上的表达式,代码现在是:
StartOfExpression.*\r?\n.*EndOfExpression
【讨论】:
</label>.*\r?\n.*<div 其中\r?\n 是明显的carriage_return-new_line 和.* 用于匹配可能的制表符/空格
在文件对话框中使用替换 Ctrl-Shift-H 和单行选项(?s):
(?s)start.*end
发现
start
two
three
end
单行表示:每个文件都被视为单行,点. 匹配换行符\n。缺点:您必须使用 Find All 并全部替换,或者手动替换。查找下一个不起作用。
对于非模态对话框Ctrl-H并找到next,使用(.*\n)*匹配任意行数:
start(.*\n)*.*end
无论哪种方式,您都可以通过插入 \n 来用多行替换您的发现。
【讨论】:
end 之前),所以它不是贪婪的。即:start(.*\n)*.*?end
start和end之间的字符。如果你想找到下一个end,请使用非贪婪版本:(?s)start.*?end,或start(.*\n)*?.*?end。
(?s)时遇到问题了吗?
这适用于今天的 Visual Studio 2012:
fooPatternToStart.*(.*\n)+?.*barPatternToEnd
查看(.*\n)+? 部分如何跨多行进行匹配,非贪婪。fooPatternToStart 是您开始行上的一些正则表达式模式,而barPatternToEnd 是您可以在下面的另一行中找到的模式,下面可能有很多行...
找到示例here。
简单有效:)
注意:在 VS2012 之前,有效的模式是:fooPatternToStart.<em>(.</em>\n)+@.*barPatternToEnd
【讨论】:
sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__ 在sprintf 和__func__ 之间搜索log,谢谢! Tho.. 它似乎在寻找无穷大.. 如果只有一种方法来限制行数
注意:这个答案是使用 Visual Studio 中使用的正则表达式语法,直到并包括 VS 2012。在 VS 2013 及更高版本中,正则表达式语法已更改。
您可以在表达式中包含\n。例如,这里是一个正则表达式,我用它从任何不是存储过程的东西中“清除”自动生成的 SQL 脚本(它将匹配以包含“Object:”的行开头的文本块,后跟不是“StoredProcedure”,然后匹配以下行,直到一行包含单词“GO”):
/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n
【讨论】:
您可能需要在表达式末尾使用 \r\n。
【讨论】:
非贪婪多行任意字符捕获,Visual Studio 2013+:
.*?\r?\n.*?
Giles Roberts 回答中的贪婪版本。
【讨论】:
对于在搜索 VS Code 时来到这里的每个人,我使用它来匹配从 script 到任何带有 2 个换行符(不包括换行符)的任何内容:
script(.|\n)+?(?=\n\n)
替换 script 和 \n\n 以匹配它们之间的所有内容。
【讨论】: