结构化搜索和替换
有时,标准的搜索方法,例如搜索某个符号的用法或匹配某些正则表达式的文本出现,可能无法提供所需的结果。 例如,您可能需要查找特定于项目的代码异味或需要重构的代码片段。
ReSharper 允许您查找并在必要时替换与特定模式匹配的代码块。 这些代码块可能非常不同——它们可能包含不同的类型、表达式、语句等,但逻辑上是相似的。 例如,您可以创建一个通用模式,该模式将匹配所有 foreach 循环,而不管循环中迭代的内容和循环体内的内容,或者您可以使此模式更详细,仅查找迭代特定类型的循环。 模式可以根据您的需要复杂到任意程度,并具有任何所需的细节级别。
您创建的所有模式都存储在您的 模式目录中,并作为自定义 代码检查 ,具有自定义的严重性级别。 这意味着所有与特定模式匹配的代码块都可以在编辑器中 以提示、建议、警告或错误的形式高亮显示。 快速修复和 范围内修复也可以为模式提供——它们可以根据模式“替换”部分的定义转换匹配的代码块。
搜索模式中的占位符
一个模式通常由以下部分组成:
文本部分,必须仅包含目标语言中允许的标识符。 通过文本部分,您可以定义需要精确匹配的内容。 请注意,空格、制表符和换行符会被忽略。
占位符,允许匹配目标代码块的可变部分。 占位符的格式如下:
$placeholder_name$- 其中 placeholder_name 是一个任意标识符。
每个占位符必须定义一次,并且可以在模式中多次使用。 定义占位符时,您需要定义其类型和可选约束。 占位符有五种类型:
参数占位符——方法调用中的一个或多个参数。 如有必要,您可以指定应匹配的参数的最小或最大数量。
表达式占位符——一系列运算符和操作数。 您可以选择性地指定此表达式返回的类型。
标识符占位符——任何符号标识符。 您还可以额外指定一个正则表达式,用于匹配符号名称。
语句占位符——以分号结尾的单行语句或语句块。 如有必要,您可以指定应匹配的语句的最小或最大数量。
类型占位符——值类型或引用类型。 默认情况下,此类占位符将匹配任何类型,但您可以显式指定特定类型。
请注意,为模式的特定部分选择正确类型的占位符非常重要。 如果您的模式未能匹配其应匹配的代码块,问题通常出在占位符类型选择不正确。

创建搜索模式
要搜索或替换代码块,或创建自定义 代码检查 ,您需要创建一个搜索模式。 您可以使用现有的代码块作为模式的基础,也可以从头开始创建一个新模式。
在编辑器中,选择一个应由模式匹配的代码块。 此步骤是可选的,但它将帮助您更快地创建模式。
从主菜单中选择 ,或者右键单击选择内容(如果有),然后在上下文菜单中选择 使用模式搜索。 使用模式搜索对话框将打开。
如果在第一步中选择了一些代码块,ReSharper 会检测块中的所有符号名称,并将它们替换为 占位符。 如有必要,您可以编辑代码,添加和删除占位符以获得所需的模式:
ReSharper 检查模式中使用的所有占位符是否在对话框右侧有正确的定义。 如果有未定义的占位符,它们将以红色高亮显示。
要添加新占位符,只需键入
$<placeholder_name>$,其定义将自动添加。始终检查自动添加的占位符定义的类型。 有时无法明确定义类型,因此您可能需要手动更正。
要更改占位符的类型或指定约束,请在右侧选择占位符定义,单击 编辑 ,并编辑占位符定义。
一旦您在模式主体中删除了占位符的使用,其定义将自动删除。
也可以手动添加和删除占位符定义。 为此,请单击占位符定义列表上方的相应按钮。
根据您是否希望匹配相似的代码块,选中或清除 匹配相似结构 复选框。
ReSharper 将以下结构视为相似:
单行语句和用大括号括起来的单行语句。
按模式指定的二元表达式及其反向顺序。
按模式指定的表达式及操作数顺序不同的表达式。
操作数用括号括起来的表达式和未用括号括起来的表达式。
后缀和前缀递增运算符。
具有不同访问修饰符的方法。
ReSharper 在模式主体中执行基本代码分析。 如果未发现错误,您可以 搜索匹配的代码块, 定义匹配块的替换方式 ,或者只需单击 保存 将模式保存到 模式目录。
指定替换模式
对于每个搜索模式,您可以添加一个替换模式,这将允许您快速替换与搜索模式匹配的代码块。
管理模式目录
当您保存创建的模式时,ReSharper 会将其放入其模式目录中。 要查看目录并研究现有模式,请转到 ReSharper 选项的 页面,或者只需在 使用模式搜索对话框中单击 模式目录
。
您可以在模式目录中执行以下操作:
要预览模式,请在列表中选择它。 您将在页面底部看到其主体和占位符的定义。
要删除模式,请在列表中选择它,然后单击页面工具栏上的 删除。
要添加新模式,请单击工具栏上的 添加模式。 ReSharper 将打开 使用模式搜索对话框,您可以在其中 指定模式详细信息。
所有模式都用于 ReSharper 的 代码检查引擎 ,因此匹配的代码块会自动检测。
默认情况下,所有新模式在严重性级别选择器中为“不要显示”,这意味着匹配的代码块既不会在编辑器中 高亮显示 ,也不会在 特定范围内运行检查时检测到。 如果您希望在代码检查中检测与搜索模式匹配的代码,请为模式选择适当的严重性级别。
要编辑现有模式,请双击它或选择它,然后单击窗口工具栏上的 编辑。
当模式打开进行编辑时,您可以为其搜索和替换部分指定描述。 搜索描述将用于在目录中显示模式,并作为编辑器中高亮显示的匹配块的描述。 替换描述显示为快速修复的名称,建议用于高亮显示的块。 更多信息请参阅 创建自定义代码检查和快速修复。
您可以为模式指定一个“抑制键”——一个标识符,您可以使用它通过注释 抑制 ReSharper 检查检测到的模式使用。

使用模式查找和替换代码
有三种使用模式搜索和替换代码的方法:
您可以在调用 使用模式搜索 命令并 创建新模式后立即搜索或替换代码。 在这种情况下,您只需单击 查找/替换 按钮,位于 使用模式搜索对话框的右下角。
您可以使用 模式目录中的模式之一。 为此,请单击 ReSharper 选项的 页面工具栏上的 立即搜索。
与模式匹配的代码块可以在编辑器中 高亮显示。 如果为模式指定了替换逻辑,您将能够使用 快速修复替换代码块。 您只需为模式指定“不要显示”以外的某个严重性级别即可。 使用 ReSharper 选项的 页面右侧的相应选择器。 有关更多信息,请参阅 创建自定义代码检查和快速修复。
如果您以前三种方式之一运行搜索,解决方案中的所有匹配代码块都列在 查找结果 窗口中。 如果结果不包括您要查找的内容,您可以快速修改模式并再次调用搜索过程。 为此,请单击窗口工具栏上的 更改搜索模式
。
如果您以前三种方式之一运行替换,解决方案中的所有替换候选项都显示在 替换为模式 对话框中。 在此对话框中,您可以研究和分组候选项。如果您想在上下文中查看候选项,请单击工具栏上的 显示预览
。 您还可以双击任何候选项以在编辑器中打开包含的文件。
如果显示的候选项是您想要替换的内容,请单击对话框底部的 替换。
共享模式
您的搜索和替换模式可以保存在 共享设置层中,并可供您的整个团队使用。
如果您在 ReSharper 选项的 页面上创建模式,请单击 保存到 ,然后在模式准备好后选择共享设置层。
要共享尚未共享的现有模式,请打开它进行编辑,然后在 编辑高亮模式对话框中单击 保存副本。 然后单击 保存到 ,然后选择共享设置层。
此功能在以下语言和技术中 受支持:
此处提供的说明和示例针对在 C# 中使用该功能。 有关其他语言的更多信息,请参阅 语言和框架 部分中的相应主题。