执行 Regex.Replace() 时如何使用命名组

Posted

技术标签:

【中文标题】执行 Regex.Replace() 时如何使用命名组【英文标题】:How to use named groups when performing a Regex.Replace() 【发布时间】:2012-10-09 08:26:29 【问题描述】:

在执行 Regex.Replace 时如何使用命名捕获?我已经走到了这一步,它做了我想要的,但不是我想要的:

[TestCase("First Second", "Second First")]
public void NumberedReplaceTest(string input, string expected)

    Regex regex = new Regex("(?<firstMatch>First) (?<secondMatch>Second)");
    Assert.IsTrue(regex.IsMatch(input));
    string replace = regex.Replace(input, "$2 $1");
    Assert.AreEqual(expected, replace);

我想用命名捕获匹配这两个词,然后在执行替换时使用(命名)捕获。

【问题讨论】:

【参考方案1】:

您可以使用"$secondMatch $firstMatch",而不是"$2 $1"

你可以做的所有替换列表here。

这是一个简短的列表:

$number - 按编号捕获的组。

$name - 按名称捕获的组。

$$ - $ 字面量。

$& - 整场比赛。

$` - 匹配前的输入字符串。

$' - 匹配后的输入字符串。

$+ - 最后一组被捕获。

$_ - 整个输入字符串。

【讨论】:

如何在保持字符串其余部分不变的情况下将命名组替换为其他值?【参考方案2】:

只需替换为$groupName

[TestCase("First Second", "Second First")]
public void NumberedReplaceTest(string input, string expected)

    Regex regex = new Regex("(?<firstMatch>First) (?<secondMatch>Second)");
    Assert.IsTrue(regex.IsMatch(input));
    string replace = regex.Replace(input, "$secondMatch $firstMatch");
    Assert.AreEqual(expected, replace);

【讨论】:

以上是关于执行 Regex.Replace() 时如何使用命名组的主要内容,如果未能解决你的问题,请参考以下文章

C# Regex.Replace 匹配相同数量的字符

Regex.Replace 中的 MatchEvaluator 如何工作?

Regex.Replace 替换空匹配

等效于 C++ 中的 Regex.Replace

C#Regex使用匹配值替换

我的 Regex.Replace 不起作用