给定一个带有四个参数的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);
}
这是我想要实现的一个例子:
或
除了寻找其他SO问题和答案外,我还看了MSDN,但没有看到任何与我的情况有关的例子。
答案 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];
}));