繁体   English   中英

如何有条件地将前导零添加到正则表达式中

[英]How to conditionally add leading zero to Regex.Replace evaluator

给定一个具有四个参数的Regex.Replace评估器,是否可以有条件地向其中一个参数添加前导零?

注意:我正在使用Visual Studio Ultimate 2013(带有C#版本5)。

尽管问题可能与类似,但一个关键的区别是我的评估者有多个参数,我需要有条件地在四个参数之一中添加前导零。

有没有一种方法可以:

(a)在评估器表达式的$3中添加一个条件成分,或
(b)截取Regex.Replace函数以将条件前导零应用于参数$3

这就是“有条件的”的意思。 *参数$3必须包含两个数字。 如果$3在1到9之间,则需要添加一个前导零。 如果大于9,则无需添加零。

private static void Main(string[] args)
{
    const string search = "SCI.9-12.2.2.PO 1.a";
    const string pattern = @"SCI\.9-12\.(\d)\.(\d)\.PO (\d{1,2})(.\w)?";
    const string evaluator = "SCHS-S$1C$2-$3$4";

    /*
     * add leading zero to $3 only if $3 is a single-digit
     */

    var output = Regex.Replace(search, pattern, evaluator);

    Console.WriteLine(output);
}

这是我要达到的目标的一个示例:

  • 输入:SCI.9-12.2.2.PO 1.a
  • 输出:SCHS-S2C2-01.a

要么

  • 输入:SCI.9-12.2.2.PO 10.a
  • 输出:SCHS-S2C2-10.a

除了查找其他SO问题和答案外,我查看了MSDN,但没有找到与我的情况有关的任何示例。

使用MatchEvaluator lambda代替替换字符串。

var output = Regex.Replace(search, pattern, s => $"SCHS-S{s.Groups[1].Value}C{s.Groups[2].Value}-{(Regex.IsMatch(s.Groups[3].Value, @"^[1-9]$") ? ("0"+s.Groups[3].Value) : s.Groups[3].Value)}{s.Groups[4].Value}");

或者,如果您像我一样,认为很多特殊用途的收藏应该替换为通用收藏,并且在上面看到太多重复,

var output = Regex.Replace(search, pattern, s => {
    var GroupValues = s.Groups.Cast<Group>().Select(g => g.Value).ToArray();
    return $"SCHS-S{GroupValues[1]}C{GroupValues[2]}-{(Regex.IsMatch(GroupValues[3], @"^[1-9]$") ? "0" + GroupValues[3] : GroupValues[3])}{GroupValues[4]}";
});

您可能使用委托。

        string sTrg = "SCI.9-12.2.2.PO 1.a";
        Console.WriteLine("{0}", sTrg);

        Regex rX = new Regex(@"SCI\.9-12\.(\d)\.(\d)\.PO[ ](\d{1,2})(.\w)?");
        Console.WriteLine("{0}", rX.Replace(sTrg, 
            delegate (Match m) {
                return "SCHS-S" + m.Groups[1] + "C" + m.Groups[2] + "-" +
                       (m.Groups[3].Length == 1 ? "0" : "") + m.Groups[3] + m.Groups[4];
            }));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM