【问题标题】:Regex.Replace: Conditional replacement based on optional groupRegex.Replace:基于可选组的条件替换
【发布时间】:2016-10-26 17:01:44
【问题描述】:

我在 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 年。标志为:abc”。

非常感谢任何帮助。

【问题讨论】:

  • 你能分享一些你当前的代码吗?
  • 请花点时间熟悉一下编辑器。如果您发布代码,您应该使用一个代码格式化命令 (Ctrl-K),否则 markdown 将解释 *(和其他),从而改变您的代码的含义。

标签: c# regex


【解决方案1】:

您可以根据指定组是否参加比赛(=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);

online demo

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2021-05-28
    • 2021-01-22
    • 2020-10-16
    相关资源
    最近更新 更多