.net - 正规表达式. NET Regex.Replace

  显示原文与译文双语对照的内容

是否可以用某个常量值或者另一个命名匹配替换命名匹配? 如果输入字符串包含" 123",如果该字符串包含,那么如果字符串包含" 234",则使用" 678"替换。 我需要使用 Regex.Replace,因为使用了使用 Regex.Replace的API并改变了这个API并不是我想要的。

所以我为那个 API matchPattern & replacePattern提供了什么来获得类似的东西:

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

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

时间: 原作者:

仅通过 正规表达式 替换调用是不可能的。 但是,你可以提供回调函数:


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));



原作者:

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

假设 123,456,789将被替换为 111,444,777,而 000在字符串中保持完整。

name the group 中,我使用了一种方法,它将作为 a replacement value 使用。 例如在这里部分中:

(<111> 123 ) = 值 123将被值为 111,它的中iso也是组的名称。

因此,一般的Pattern 将成为: (?<ValueToReplace>ValueToSearch)

下面是一个示例代码:


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()))



我希望你能在 VB.Net 中工作,但我也附加了 C# 版本。

这里是 C# 版本:


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()));



原作者:
...