2012-11-21 64 views
0

是否有可能通過一些常數或另一個命名比賽更換了一個名爲匹配? 可以說我有輸入字符串,如果含有「123」的「567」 如果字符串「234」我希望它是「678」取代取代「123」。我需要做的是使用Regex.Replace,因爲我用它使用Regex.Replace API和更改API是不是我想要的。正則表達式的.Net Regex.Replace

所以我提供該API matchPattern & replacePattern得到類似的東西:

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

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

+0

那麼你的意思是你要在一個固定的'replacePattern',做不同的事情取決於輸入通過? – Tomalak

+1

爲什麼不執行兩個Regex.Replace commmands? – Paparazzi

回答

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

我預計會有一些其他的方法可以做到這一點,但我想出了一個使用named groupsanonymous 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()));