Regex.Replace:基于可选组的条件替换

时间:2016-10-26 08:45:25

标签: c# regex

我在C#中使用Regex.Replace。在替换的字符串中,我想提出一个条件,即如果捕获了一个可选组,则只出现字符串的一部分。例如,我有这个正则表达式: -

(?<Expiry>\d+[my])\s+(?<Flag>[a-z][A-Z])?\s*$)

请注意,Flag捕获的群组是可选

替换字符串是

"Expiry is ${Expiry}. Flag is : ${Flag}"

现在,如果捕获了Flag组,我希望"Flag is : ${Flag}"字符串仅出现在结果中。

我正在使用以下代码:

var regex = new
Regex("(?<Expiry>\d+[my])\s+(?<Flag>[a-z][A-Z])?\s*$)",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
string result = regex.Replace("10y", "Expiry is ${Expiry}. Flag is : ${Flag}";

结果应由Expiry is 10y

string result = regex.Replace("10y abc", "Expiry is ${Expiry}. Flag is ${Flag}");

结果应为“到期时间为10年。标志为:abc”。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以根据指定的群组是否参加比赛(=匹配)来使用不同的替换值。

请参阅以下示例:

var s = "1m aZ";
var pat = @"(?<Expiry>\d+[my])\s+(?<Flag>[a-z][A-Z])?\s*$";
var res = Regex.Replace(s, pat, m => m.Groups["Flag"].Success ? 
    string.Format("Flag is : {0}.", m.Groups["Flag"].Value) : 
    string.Format("Expiry is {0}.", m.Groups["Expiry"].Value));
Console.WriteLine(res);

请参阅online demo

如果Flag组匹配,则替换将为string.Format("Flag is : {0}.", m.Groups["Flag"].Value),否则,替换将仅包含到期消息。