是否可以通过某个常量值或另一个命名匹配替换命名匹配? 假设我输入了字符串,如果它包含“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”
答案 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 groups
和anonymous 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}}