
5.2 文件中查找/替换
Find in Files(文件中查找)和Replace in Files(文件中替换)命令可以将搜索从目前的解决方案拓宽到整个文件夹和文件夹结构,甚至实现按给定条件和过滤方式搜索到的所有匹配项的大规模替换。使用这些命令可以获得更多的选项,并且搜索结果可以置于两种工具窗口的其中一个窗口中,这样便于定位它们。
需要在文件中执行基于文本的简单搜索/替换任务,且该文件不一定在当前解决方案中时,这个搜索工具最适合。
5.2.1 在文件中查找
在Visual Studio内生成的搜索引擎中,真正强大的部分是Find in Files命令。该命令不局限于当前解决方案中的文件搜索,而可以搜索整个文件夹(及其所有子文件夹),查找符合搜索条件的文件。
通过菜单命令Edit | Find可以启动Find in Files对话框,如图5-4所示。如果打开了Quick Find对话框,要切换到Find in Files模式,应单击Quick Find旁的向下小箭头,并选择Find in Files项。也可以使用快捷键Ctrl+Shift+F打开这个对话框。

图5-4
大多数Quick Find选项仍然可以使用,包括正则表达式搜索,但需要使用Look In字段指定搜索的范围,而不是从项目或解决方案中选择搜索范围。可以在编辑框中输入要搜索的位置,或单击省略号按钮,以显示Choose Search Folders对话框,如图5-5所示。

图5-5
如此便可以浏览整个文件系统,包括网络驱动器,还可以在搜索范围中添加文件夹。可以将不同的文件夹层次添加到单个搜索操作中。首先用左边的Available folders列表选择要搜索的文件夹,单击向右箭头,把它们添加到Selected Folders列表中。在这个列表中可以使用上下箭头调整搜索的顺序。添加了要搜索的文件夹后,就可以单击OK按钮以返回一个用分号隔开的文件夹列表。如果要保存这组文件夹供将来使用,可以在Folder set下拉列表中输入名称,并单击Apply按钮。
保存搜索文件夹的过程不太直观,但如果把Apply按钮看成Save按钮,就容易理解该对话框了。
5.2.2 查找对话框选项
Find in Files对话框中的选项类似于Quick Find对话框。因为搜索要在IDE中没有正常打开的文件上进行,甚至在代码文件上进行,所以没有显示Search Up选项。但有一个额外的过滤器用于搜索特定的文件类型。
Look at These File Types下拉列表中包含一些扩展名集合,每个集合对应一种语言,便于轻松搜索Visual Basic、C#、J#以及其他语言的代码。也可以输入自己的扩展名,这样,如果在某个非Microsoft语言环境下工作,或者希望把文件中的查找功能用于非开发目的,就可以将搜索结果限制为对应的文件类型。
除了Find选项外,还有一些指定结果显示方式的配置选项。在搜索时,可以从两个不同的结果窗口中选择一个,保证在不丢失以前操作结果的情况下实现后继搜索。如果显示搜索的完整输出,结果就会非常冗长;但是,如果只要查找出包含所需信息的文件,可以选中Display File names Only选项,此时结果窗口将仅为每个文件列出一行。
5.2.3 正则表达式
正则表达式使搜索技术到达一个全新的高度,它基于.NET Framework中生成的完整的RegEx引擎,能够完成复杂的文本匹配。本书不会详细讨论正则表达式的高级匹配功能,但是如果在搜索条件中选择使用正则表达式,可以参考查找和替换对话框提供的一些补充帮助信息。
图5-6显示了用于生成正则表达式的表达式生成器。使用其中的菜单可以轻松地生成正则表达式,该菜单中显示了最常用的正则表达式短语和符号,以及每一项的英文说明。如果已经用过以前版本Visual Studio中的表达式生成器,则会注意到现在有更多可供选择的“内置”模式。

图5-6
在反转赋值语句时,使用正则表达式就会非常方便。例如,如果有如下代码:
VB
Description = product.Description Quantity = product.Quantity SellPrice = product.SellPrice
C#
Description = product.Description; Quantity = product.Quantity; SellPrice = product.SellPrice;
反转赋值语句的代码如下:
VB
product.Description = Description product.Quantity = Quantity product.SellPrice = SellPrice
C#
product.Description = Description; product.Quantity = Quantity; product.SellPrice = SellPrice;
这是使用正则表达式执行Quick Replace操作,而不是手动修改每一行代码的一个好例子。确保在查找选项中选择了正则表达式,再把如下代码作为要查找的文本输入:
VB
{<.*} = {.*}
C#
{<.*} = {.*};
把如下所示的代码输入为要替换的文本:
VB
\2 = \1
C#
\2 = \1;
下面进行简单的解释:我们要搜索两个用等号隔开的组(用花括号定义)。第一个组搜索单词的第一个字符( < ),再搜索其后的字符(.*)。第二个组在任意字符中搜索,直到在VB示例中找到行末字符,或者在C#示例中找到分号为止。接着进行替换,即插入第二个组找到的字符、一个等号(两边都有空格)以及第一个组找到的字符(在C#示例中,还要插入一个分号)。如果不熟悉正则表达式,可以花点时间研究它,但与普通的手动过程相比,执行这样的查找替换任务是非常快捷方便的。
5.2.4 结果窗口
执行Find in Files操作时,结果显示在两个Find Results窗口的其中一个内。这些窗口显示为停靠在IDE工作区底部的工具窗口。对于符合搜索条件的每一行,结果窗口会显示一整行信息,包括文件名和路径、包含匹配结果的行号以及匹配文本所在的行,从而可以快速看到上下文(见图5-7)。
每个结果窗口的顶部都有一个小工具条(见图5-7,图5-8(a)对其进行了放大),用于查看结果。也可以通过上下文菜单访问这些命令,见图5-8(b)。

图5-7

图5-8
只双击某个匹配结果,就可以查看该匹配结果。
5.2.5 在文件中替换
虽然搜索大量文件来找到符合搜索条件的大量匹配结果很有用,但更有用的是Replace in Files操作。按下快捷键Ctrl+Shift+H或单击Quick Replace旁的向下箭头,即可访问这个操作,Replace in Files操作的实现方式与Find in Files相同,所有的选项也相同。
主要的区别是在替换文件时,可以使用一个附加的Results选项。在实现类似的大量替换操作时,这个功能可以在提交产生的更改前轻松地做出最后确认。为了使这个检查确认功能可用,选中Keep modified files open after Replace All复选框,见图5-9所示对话框的底部。

图5-9
注意,这个功能只能在使用Replace All时起作用;如果只是单击Replace按钮,Visual Studio将会打开包含下一个匹配结果的文件,并使该文件在IDE中处于打开状态。
警告:如果没有选中该复选框,但要对大量文件实现大量替换操作,那么这些文件将被永久更改,不能撤消。此时一定要知道自己在做什么。
无论是否选中该复选框,在实现Replace All操作后,Visual Studio会将文件中发生更改的数目反馈给用户。如果不想看到这个对话框,可以在将来的搜索中隐藏它。