这只是一个出于好奇的问题 - 我在看this question,我想知道如何在一个Regex Replace中进行所需的替换。
所以,情况是我们有以下输入:
8.11.2012 16:15:10
21.11.2012 15:00:54
11.11.2012 0:24:24
8.11.2012 16:06:53
9.11.2012 0:49:37
想要创建以下输出:
08_11_2012_16_15_10
21_11_2012_15_00_54
11_11_2012_00_24_24
08_11_2012_16_06_53
09_11_2012_00_49_37
换句话说:
\b(\d)\b
替换为0$1
[\s\:.]
替换为_
我的问题是,是否有任何方法可以在单个正则表达式中进行BOTH替换,或者是否有必要进行2次替换迭代?
那会是什么样的?
只是想在这里学习 - 谢谢!
另外,即使这个问题被问到Notepad ++,我也使用.Net(C#/ VB)。
答案 0 :(得分:2)
您需要将它们作为2次单独替换。
正则表达式取代说找到这个匹配&用这个值替换它。您替换它的内容可以包括对原始匹配的引用,同时您可能会想出一个复杂的模式来匹配&取而代之的是,它只会让你的表达更复杂,实际工作的可能性也会降低。
答案 1 :(得分:1)
您需要进行2次更换。
问题是没有条件替换字符串,如果你想要出现“0”,“0”肯定需要成为替换字符串的一部分。
如果你只有一个替代品,即“_”(而不是“0”或“_”或两者)导致:“_8_16_45__0_16_43”,那么就有办法做到这一点:)
我的2美分。
答案 2 :(得分:1)
在C#中,您可以使用委托:
在一次迭代中完成String result = Regex.Replace(input, @"(\d{1,2})\.(\d{1,2}).(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2})",
delegate(Match match)
{
string[] array = { match.Groups[1].Value.PadLeft(2, '0'), match.Groups[2].Value.PadLeft(2, '0'), match.Groups[3].Value.PadLeft(2, '0'), match.Groups[4].Value.PadLeft(2, '0'), match.Groups[5].Value.PadLeft(2, '0'), match.Groups[6].Value.PadLeft(2, '0')};
return String.Join("_", array);
});
要允许不同的分隔符,请使用[\s\:.]
代替\.