如何有条件地将前导零添加到Regex.Replace评估程序

时间:2017-06-21 21:35:43

标签: c# regex

给定一个带有四个参数的Regex.Replace求值程序,是否可以有条件地将前导零添加到参数的一个

注意:我使用的是Visual Studio Ultimate 2013(使用C#版本5)。

虽然问题可能类似于this,但一个关键的区别是我的评估者有多个参数,我需要有条件地将前导零添加到四个参数的一个。 / p>

有没有办法:

(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,但没有看到任何与我的情况有关的例子。

2 个答案:

答案 0 :(得分:2)

使用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]}";
});

答案 1 :(得分:1)

您可以使用委托。

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