系统环境:Windows 8.1 Enterprise Update 2 x64
开发环境:Mircosoft Visual Studio Ultimate 2013 Update 2 RC
问题:如何在Visual Studio中使用正则表达式匹配换行符,空白符,Tab符等特殊符号,并且在当前文档或当前项目或整个解决方案中批量替换你指定的代码文字?
例子:
/// <summary>
/// 根据条件查询表中所有数据
/// </summary>
/// <param name="tableName">要分页显示的表名</param>
/// <param name="fieldShow">以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段</param>
/// <param name="fieldOrder">以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC用于指定排序顺序</param>
/// <param name="where">查询条件</param>
/// <returns></returns>
List<T> GetAllData<T>(string tableName, string fieldShow, string fieldOrder, string where) where T : new();
答案:
在Visual Studio IDE 中按 Ctrl+Shift+H 打开[在文件中替换]的窗口,
在{查找内容(N):}文本框中输入:
</returns>[\s]+[^\S\r\n]+List<T>
或者
</returns>[\r\n]+[^\S\r\n]+List<T>
在{替换为(P):}文本框中输入:
</returns>\r\n\t\t[Obsolete("不建议使用该方法,请使用同签名的方法代替。")]\r\n\t\tList<T>
在{查找范围(L):}下拉框中选择,你需要查找的范围,因为我是要整个当前项目中所有匹配项替换,所以我选择的是"当前项目"。
按{全部替换(A)},就会把所有匹配项全部替换成你所需要替换的内容了。
这次我批量替换了共67个文件,67行。
解答:这次我是想在XML注释的尾部以及该尾部的下一行首单词中间添加一行
[Obsolete("不建议使用该方法,请使用同签名的方法代替。")]
XML尾部是</returns>,而该尾部的下一行首单词是List<T>,在这两行之间有几个我们看不见的转义符\r\n\t,然而如果我们把正则表达式写成这样:
</returns>[\r\n\t]+List<T>
或者
</returns>[\r\n]+[\t\t]+List<T>
你将无法匹配到任何行。
因为在Visual Studio,你若需要匹配换行符以及空白符,需要配合[\S\s]以及[^]。
而\S\s是什么意思呢?
大写的\S是匹配任何非空白字符。
小写的\s是匹配任何空白字符,其中包括空格,制表符和换页符。
而^是将匹配字符串锚定到行首或字符串首。
+就不用说了吧?是匹配前面表达式的一个或更多匹配项(并匹配尽可能多的字符)。
因为行尾包含\r\n,所以你可以用[\r\n]或者[\s],在不确定有多少个这样的特殊转义符的情况下,使用[\r\n]+或者[\s]+
重点来了,因为要匹配下一行,即换行,所以你还需要加个^,在你有用Visual Studio内置格式化的情况下,虽然行首是一个\t或以上,但是你仍然要用\S来替代,组合起来就是[\S\r\n]+。
拼接起来就得到了</returns>[\s]+[^\S\r\n]+List<T>了。
而在{替换为(P):}那里,比较简单,就不做详述了。
参考Visual Studio 官方MSDN在线帮助文档:http://msdn.microsoft.com/en-us/library/2k3te2cs.aspx