正规替换更换

时间:2013-06-17 15:48:54

标签: c# regex vb.net

这只是一个出于好奇的问题 - 我在看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

换句话说:

  1. 将字符串的时间/日期部分中的任何一位数字替换为“0”&单个字符。 发布的解决方案非常适合: 将\b(\d)\b替换为0$1
  2. 用“_”替换任何分隔符 这只是将[\s\:.]替换为_
  3. 我的问题是,是否有任何方法可以在单个正则表达式中进行BOTH替换,或者是否有必要进行2次替换迭代?

    那会是什么样的?

    只是想在这里学习 - 谢谢!

    另外,即使这个问题被问到Notepad ++,我也使用.Net(C#/ VB)。

3 个答案:

答案 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\:.]代替\.