我在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”。
非常感谢任何帮助。
答案 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)
,否则,替换将仅包含到期消息。