正则表达式.Net Regex.Replace

时间:2012-11-21 07:03:23

标签: .net regex

是否可以通过某个常量值或另一个命名匹配替换命名匹配? 假设我输入了字符串,如果它包含“123”,则将“123”替换为“567” 如果字符串有“234”我希望它替换为“678”。我需要使用Regex.Replace来做到这一点,因为我使用的是使用Regex.Replace的API,并且更改API并不是我想要的。

那么我为那个API提供了matchPattern& replacePattern得到类似的东西:

Regex.Replace("123", matchPattern, replacePattern)返回“567”

Regex.Replace("234", matchPattern, replacePattern)返回“678”

2 个答案:

答案 0 :(得分:2)

只有正则表达式替换调用才能实现这一点。但是你可以提供一个回调函数:

public String Replacer(Match m) {
    if (m.Groups[0].Value == "123")
       return "567";
    else if (m.Groups[0].Value == "456")
       return "678";
}

resultString = Regex.Replace(subject, @"\b(?:123|456)\b", new MatchEvaluator(Replacer));

答案 1 :(得分:1)

我希望还有其他方法可以做到这一点,但我想出了以下使用named groupsanonymous methods的方法。

我假设在我的例子中,123,456,789将分别被111,444,777替换,而000将在字符串中保持完整。

我使用name the group方法将a replacement value用作(?<ValueToReplace>ValueToSearch)。例如,这部分:

(?&lt; 111&gt; 123)=值123将被111替换,其中111也是该组的名称。

因此,一般模式将变为:Dim sampleText = "123 456 789 000" Dim re As New Regex("\b(?<111>123)\b|\b(?<444>456)\b|\b(?<777>789)\b") Dim count As Integer = re.Matches(sampleText).Count Dim contents As String = re.Replace(sampleText, New MatchEvaluator(Function(c) re.GetGroupNames().Skip(1).ToArray().GetValue(c.Captures(0).Index Mod count).ToString()))

以下是示例代码:

var sampleText = @"123 456 789 000";
Regex re = new Regex(@"\b(?<111>123)\b|\b(?<444>456)\b|\b(?<777>789)\b");
int count = re.Matches(sampleText).Count;
string contents = re.Replace(sampleText, new MatchEvaluator((c) => re.GetGroupNames().Skip(1).ToArray().GetValue(c.Captures[0].Index % count).ToString()));

从你的方法我希望你在VB.Net工作,但我也附加了一个C#版本。

这里是C#版本:

{{1}}