0

是否可以用某个常量值或另一个命名匹配替换命名匹配?假设我有输入字符串,如果它包含“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”

4

2 回答 2

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));
于 2012-11-21T07:13:00.053 回答
1

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

在我的示例中,我假设 123、456、789 将分别替换为 111、444、777,而 000 将在字符串中保持不变。

我使用了一种方法来处理name the group将用作a replacement value. 例如在这部分:

(?<111>123) = 值 123 将被 111 替换,其中 111 也是组的名称。

因此,一般模式将变为:(?<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()));
于 2012-11-21T19:42:18.167 回答