ReSharper 2025.2 Help

结构化搜索和替换

有时,标准的搜索方法,例如搜索某个符号的用法或匹配某些正则表达式的文本出现,可能无法提供所需的结果。 例如,您可能需要查找特定于项目的代码异味或需要重构的代码片段。

ReSharper 允许您查找并在必要时替换与特定模式匹配的代码块。 这些代码块可能非常不同——它们可能包含不同的类型、表达式、语句等,但逻辑上是相似的。 例如,您可以创建一个通用模式,该模式将匹配所有 foreach 循环,而不管循环中迭代的内容和循环体内的内容,或者您可以使此模式更详细,仅查找迭代特定类型的循环。 模式可以根据您的需要复杂到任意程度,并具有任何所需的细节级别。

您创建的所有模式都存储在您的 模式目录中,并作为自定义 代码检查 ,具有自定义的严重性级别。 这意味着所有与特定模式匹配的代码块都可以在编辑器中 以提示、建议、警告或错误的形式高亮显示快速修复范围内修复也可以为模式提供——它们可以根据模式“替换”部分的定义转换匹配的代码块。

搜索模式中的占位符

一个模式通常由以下部分组成:

  • 文本部分,必须仅包含目标语言中允许的标识符。 通过文本部分,您可以定义需要精确匹配的内容。 请注意,空格、制表符和换行符会被忽略。

  • 占位符,允许匹配目标代码块的可变部分。 占位符的格式如下: $placeholder_name$ - 其中 placeholder_name 是一个任意标识符。

每个占位符必须定义一次,并且可以在模式中多次使用。 定义占位符时,您需要定义其类型和可选约束。 占位符有五种类型:

  • 参数占位符——方法调用中的一个或多个参数。 如有必要,您可以指定应匹配的参数的最小或最大数量。

  • 表达式占位符——一系列运算符和操作数。 您可以选择性地指定此表达式返回的类型。

  • 标识符占位符——任何符号标识符。 您还可以额外指定一个正则表达式,用于匹配符号名称。

  • 语句占位符——以分号结尾的单行语句或语句块。 如有必要,您可以指定应匹配的语句的最小或最大数量。

  • 类型占位符——值类型或引用类型。 默认情况下,此类占位符将匹配任何类型,但您可以显式指定特定类型。

请注意,为模式的特定部分选择正确类型的占位符非常重要。 如果您的模式未能匹配其应匹配的代码块,问题通常出在占位符类型选择不正确。

结构化搜索和替换模式中的占位符

创建搜索模式

要搜索或替换代码块,或创建自定义 代码检查 ,您需要创建一个搜索模式。 您可以使用现有的代码块作为模式的基础,也可以从头开始创建一个新模式。

  1. 在编辑器中,选择一个应由模式匹配的代码块。 此步骤是可选的,但它将帮助您更快地创建模式。

  2. 从主菜单中选择 ReSharper | 查找 | 使用模式搜索… ,或者右键单击选择内容(如果有),然后在上下文菜单中选择 使用模式搜索使用模式搜索对话框将打开。

  3. 如果在第一步中选择了一些代码块,ReSharper 会检测块中的所有符号名称,并将它们替换为 占位符。 如有必要,您可以编辑代码,添加和删除占位符以获得所需的模式:

    • ReSharper 检查模式中使用的所有占位符是否在对话框右侧有正确的定义。 如果有未定义的占位符,它们将以红色高亮显示。

    • 要添加新占位符,只需键入 $<placeholder_name>$ ,其定义将自动添加。

      始终检查自动添加的占位符定义的类型。 有时无法明确定义类型,因此您可能需要手动更正。

    • 要更改占位符的类型或指定约束,请在右侧选择占位符定义,单击 编辑 ,并编辑占位符定义。

    • 一旦您在模式主体中删除了占位符的使用,其定义将自动删除。

    • 也可以手动添加和删除占位符定义。 为此,请单击占位符定义列表上方的相应按钮。

  4. 根据您是否希望匹配相似的代码块,选中或清除 匹配相似结构 复选框。

    ReSharper 将以下结构视为相似:

    • 单行语句和用大括号括起来的单行语句。

    • 按模式指定的二元表达式及其反向顺序。

    • 按模式指定的表达式及操作数顺序不同的表达式。

    • 操作数用括号括起来的表达式和未用括号括起来的表达式。

    • 后缀和前缀递增运算符。

    • 具有不同访问修饰符的方法。

  5. ReSharper 在模式主体中执行基本代码分析。 如果未发现错误,您可以 搜索匹配的代码块定义匹配块的替换方式 ,或者只需单击 保存 将模式保存到 模式目录

指定替换模式

对于每个搜索模式,您可以添加一个替换模式,这将允许您快速替换与搜索模式匹配的代码块。

  1. 创建一个新的搜索模式或从 模式目录中打开模式进行编辑。

  2. 使用模式搜索对话框中,单击右上角的 替换

  3. 在对话框下部出现的 替换模式 区域中,指定模式的替换部分。

    使用模式中定义的 占位符。 当匹配的代码块被替换时,每个由占位符匹配的代码片段将根据该占位符在替换部分中的位置进行复制。

  4. 使用替换区域下方的复选框指定是否应用 格式规则和/或在替换的代码块中将全限定名称替换为短名称。

  5. ReSharper 在模式的替换部分执行基本代码分析。 如果未发现错误,您可以 替换匹配的代码块或将模式保存到 模式目录

管理模式目录

当您保存创建的模式时,ReSharper 会将其放入其模式目录中。 要查看目录并研究现有模式,请转到 ReSharper 选项的 代码检查 | 自定义模式 页面,或者只需在 使用模式搜索对话框中单击 模式目录 ThemedIcon.PatternsCatalogue.Screen.(Gray).png

您可以在模式目录中执行以下操作:

  • 要预览模式,请在列表中选择它。 您将在页面底部看到其主体和占位符的定义。

  • 要删除模式,请在列表中选择它,然后单击页面工具栏上的 删除

  • 要添加新模式,请单击工具栏上的 添加模式。 ReSharper 将打开 使用模式搜索对话框,您可以在其中 指定模式详细信息

  • 所有模式都用于 ReSharper 的 代码检查引擎 ,因此匹配的代码块会自动检测。

    默认情况下,所有新模式在严重性级别选择器中为“不要显示”,这意味着匹配的代码块既不会在编辑器中 高亮显示 ,也不会在 特定范围内运行检查时检测到。 如果您希望在代码检查中检测与搜索模式匹配的代码,请为模式选择适当的严重性级别。

  • 要编辑现有模式,请双击它或选择它,然后单击窗口工具栏上的 编辑

    当模式打开进行编辑时,您可以为其搜索和替换部分指定描述。 搜索描述将用于在目录中显示模式,并作为编辑器中高亮显示的匹配块的描述。 替换描述显示为快速修复的名称,建议用于高亮显示的块。 更多信息请参阅 创建自定义代码检查和快速修复

    您可以为模式指定一个“抑制键”——一个标识符,您可以使用它通过注释 抑制 ReSharper 检查检测到的模式使用。

ReSharper 选项中的模式目录

使用模式查找和替换代码

有三种使用模式搜索和替换代码的方法:

  • 您可以在调用 使用模式搜索 命令并 创建新模式后立即搜索或替换代码。 在这种情况下,您只需单击 查找/替换 按钮,位于 使用模式搜索对话框的右下角。

  • 您可以使用 模式目录中的模式之一。 为此,请单击 ReSharper 选项的 代码检查 | 自定义模式 页面工具栏上的 立即搜索

  • 与模式匹配的代码块可以在编辑器中 高亮显示。 如果为模式指定了替换逻辑,您将能够使用 快速修复替换代码块。 您只需为模式指定“不要显示”以外的某个严重性级别即可。 使用 ReSharper 选项的 代码检查 | 自定义模式 页面右侧的相应选择器。 有关更多信息,请参阅 创建自定义代码检查和快速修复

如果您以前三种方式之一运行搜索,解决方案中的所有匹配代码块都列在 查找结果 窗口中。 如果结果不包括您要查找的内容,您可以快速修改模式并再次调用搜索过程。 为此,请单击窗口工具栏上的 更改搜索模式 ThemedIcon.Edit.Screen.(Gray).png

如果您以前三种方式之一运行替换,解决方案中的所有替换候选项都显示在 替换为模式 对话框中。 在此对话框中,您可以研究和分组候选项。如果您想在上下文中查看候选项,请单击工具栏上的 显示预览 ThemedIcon.PreviewToggle.Screen.(Gray).png。 您还可以双击任何候选项以在编辑器中打开包含的文件。

如果显示的候选项是您想要替换的内容,请单击对话框底部的 替换

共享模式

您的搜索和替换模式可以保存在 共享设置层中,并可供您的整个团队使用。

如果您在 ReSharper 选项的 代码检查 | 自定义模式 页面上创建模式,请单击 保存到 ,然后在模式准备好后选择共享设置层。

要共享尚未共享的现有模式,请打开它进行编辑,然后在 编辑高亮模式对话框中单击 保存副本。 然后单击 保存到 ,然后选择共享设置层。

此功能在以下语言和技术中 受支持

语言:C#

语言:VB.NET

语言:C++

语言:ASP.NET

语言:Razor

语言:XAML

语言:Resx

语言:构建脚本

语言:SQL

此功能在 C# 中可用

此功能在 Visual Basic 中可用

功能在 C++ 中不可用

此功能在 ASP.NET 中可用

此功能在 Razor 中不可用

此功能在 XAML 中不可用

此功能在资源文件中不可用

此功能在构建脚本文件中不可用

此功能在 SQL/NoSQL 文件和注入中不可用

此处提供的说明和示例针对在 C# 中使用该功能。 有关其他语言的更多信息,请参阅 语言和框架 部分中的相应主题。

最后修改日期: 2025年 9月 27日