0

出于好奇,这只是一个问题-我正在研究这个问题,我想知道您如何才能在一个 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)\b0$1
  2. 用“_”替换任何分隔符,这将简单地替换[\s\:.]_

我的问题是是否有任何方法可以在单个正则表达式中进行两次替换,或者是否绝对有必要进行 2 次替换迭代?

那会是什么样子??

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

此外,即使针对 Notepad++ 提出了这个问题,我也使用 .Net (C# / VB)。

4

3 回答 3

2

您需要将它们作为 2 个单独的替换来执行。

正则表达式替换说找到这个匹配并用这个值替换它。您替换它的内容可以包括对原始匹配的引用,虽然您可能会想出一个复杂的模式来匹配和替换这两个东西,但这只会使您的表达式更加复杂并且不太可能实际工作。

于 2013-06-17T16:13:02.163 回答
1

您需要进行 2 次更换。

问题是没有条件替换字符串,如果您希望出现“0”,则“0”肯定需要成为替换字符串的一部分。

如果您只有一个替换,即“_”(而不是“0”或“_”或两者)导致:“_8_16_45__0_16_43”,那么将有一种方法可以做到这一点:)

我的 2 美分。

于 2013-06-17T16:23:17.307 回答
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\:.]而不是\.

于 2013-06-17T16:27:44.347 回答