【问题标题】:How do you reference a capture group with regex find and replace in Visual Studio 2012, 2013, 2015, and VS Code如何在 Visual Studio 2012、2013、2015 和 VS Code 中使用正则表达式查找和替换来引用捕获组
【发布时间】:2025-12-22 13:20:13
【问题描述】:

我意识到对此有很多问题,但我发现没有一个特别提到他们所指的 VS 版本。由于缺少这些重要信息,我仍然无法成功使用我找到的答案。最常见的是

  • 用 {} 包围,用 \1、\2、\n 显示捕获

但是,这似乎是在 Visual Studio 中进行正则表达式查找和替换的旧方法,并且在 VS 2012 中不起作用。

【问题讨论】:

  • 这在帮助中并不难找到:在搜索/替换对话框中,F1;在Finding and Replacing Text的早期,有一个Using Regular Expressions in VS的链接;第二个提示是指您正则表达式中的替换;它为您提供了基础知识,并在替换编号组替换命名组下提供了更多详细信息。
  • @PJTraill 很高兴知道他们在 2013 年至 2015 年之间的某个时候更容易回答他们的 2012 年版本的问题。不过,通过投票,我认为很明显它仍然不是“不太很难”在帮助中找到。 IMO:如果在堆栈溢出文章上搜索和投票比使用查找、替换、捕获更容易而不需要查找帮助,那么它比应该的要困难得多。
  • MSVS 2012/3 让我烦恼的一件事是两个不同的搜索/替换对话框,特别是较小的 (Ctrl-H) 对话框,我不小心保留在其中(击键可能在某处有其他含义else) 改变搜索范围。但我要说明的一点是,较大的 (Ctrl-Shift-H) 对话框在“查找”和“替换”字段之后有按钮,可以为您提供更重要的可能性列表,包括您正在查找的内容因为——所以你不需要帮助!我想很多人要么没有发现按钮,要么在 Ctrl-H 对话框中着陆并且看不到它们。
  • 我同意这个帮助有点麻烦;我怀疑他们优先考虑纯文本搜索。我的观点更多的是,如果人们知道或假设它一定在那里,那么可以相当容易地找到它;我经常遵循这条路线,因为一旦找到规范文档,我就更喜欢使用它。我不是故意贬低的。我认为它既是“太难”又是“不太难”——如果您将“不太”视为限定“难”并在隐含的“为什么难”的答案中添加答案,它们并不是对立的。
  • 我“知道”REGEXP 标记正在使用 '()',重新阅读文档,但它不起作用......所以我来这里确认......然后我做了一些更多的实验,它奏效了。所以恕我直言,MSDN 文档需要非常清楚 () 用于“标记”表达式,对于我们这些必须学习旧的 VS6“标记”命名法的人来说。如果他们可以使用相同的命名法,那就太好了。编号组......只是没有足够好地激发突触恕我直言。

标签: visual-studio visual-studio-2012 visual-studio-2013 visual-studio-2015 visual-studio-code


【解决方案1】:

如果您想使用组名(使用与上述相同的示例):

找到什么:

_platformActions\.InstallApp\((?<mygroupname>.+)\)

替换为:

this.Platform().App(${mygroupname}).Install()

【讨论】:

    【解决方案2】:

    要改进上述答案: 你应该替换

    _platformActions.InstallApp\((.+)\)

    this.Platform().App(${1}).Install()

    如果您想在捕获后添加数字,请注意 ${1}$18 将尝试插入第 18 个搜索捕获,而不是第一个附加 8 的捕获。

    【讨论】:

    • 这是最好的答案,因为它即使在数字后缀的情况下也有效
    【解决方案3】:

    要在 VS 2012 和 VS 2015 中查找和替换,请执行以下操作:

    示例(感谢 syonip)

    在查找选项中,确保选中“使用正则表达式”,并将以下内容作为要查找的文本:

    _platformActions.InstallApp\((.+)\)

    以下内容作为替换它的文本:

    this.Platform().App($1).Install()

    注意:正如 SLaks 在下面的评论中指出的那样,正则表达式语法的变化是由于 VS2012 切换到标准的 .Net 正则表达式引擎。

    注意:另一位评论者指出这也适用于 Visual Studio Code (vscode)

    【讨论】:

    • 更一般地说,VS2012 现在使用标准的 .Net 正则表达式引擎。
    • 您不需要转义_platformActionsInstallApp 之间的句点字符吗?
    • 现在想想,这很有意义。我没有测试过。随意在那里进行编辑。
    • 最终我使用命名为数字似乎至少对我不起作用。 (?&lt;rval&gt;.+) 搜索和替换 ${rval}
    • 一些额外的帮助:如果你想用 thing$18 替换 thing(.*) (在捕获后直接添加一个 '8')你必须使用 thing${1}8跨度>
    【解决方案4】:

    要添加一个示例,我必须在代码中执行以下操作:

    找到什么:

    _platformActions.InstallApp\((.+)\)
    

    替换为:

    this.Platform().App($1).Install()
    

    这将使用 this.Platform().App(x).Install() 替换对 InstallApp(x) 的任何调用。

    *不要忘记在查找选项中标记“使用正则表达式”

    【讨论】: