正则表达式.替换:根据可选组进行条件替换

本文关键字:替换 条件 正则表达式 | 更新日期: 2023-09-27 18:15:02

我使用正则表达式。在c#中替换。在替换的字符串中,我想设置一个条件,即只有在捕获可选组中的一个时,才会显示字符串的一部分。例如,我有这个regex:-

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

注意Flag捕获组为可选

替换字符串为

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

现在我想要"Flag is : ${Flag}"字符串只出现在结果中,如果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}");

结果应该是"Expiry is 10y "。标志是: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),否则,替换将只包含过期消息