CSharp - 在可选的组中,C# Regex.Replace: 基于条件替换

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

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


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



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

替换字符串为


"Expiry is ${Expiry}. Flag is : ${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 y 。 标志为:abc"。

任何帮助都很感激。

时间: 原作者:

根据指定的组是否参与匹配( =matched ),你可以使用不同的替换值。

请参见下面的示例:


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



请参阅在线演示

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

原作者:
...