【问题标题】:Regex Replace Within Replacement正则表达式替换内替换
【发布时间】:2013-06-17 15:48:53
【问题描述】:

这只是出于好奇而提出的一个问题 - 我正在查看 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\:.]替换为_

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

那会是什么样子??

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

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

【问题讨论】:

  • 您从 5 个输入开始,但只有 4 个输出。那是错字吗?你好像不见了 09_11_2012_00_49_37
  • 仅供参考:如果这是您在 .NET 中的特定需求,您可以使用(C# 代码)完成所有这些操作:DateTime.ParseExact(@"d\/M\/yyyy H\:mm\:ss")DateTime.ToString(@"dd\_MM\_yyyy\_HH\_mm\_ss") - 而不是正则表达式。
  • @Joe - 这实际上是一个非常酷的解决方案,但这更多是关于如何在单个语句中进行 2 次正则表达式替换的问题,这只是我手头的示例......不过,这并不能阻止您的解决方案成为一个非常好的解决方案!
  • @JohnBus​​tos 我错了,删除了评论。
  • 感谢您了解@Dgrin91 - 您是 100% 正确的。我更新了问题

标签: c# regex vb.net


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在 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\:.] 而不是\.

    【讨论】:

      【解决方案3】:

      您需要进行 2 次替换。

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

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

      我的 2 美分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        • 2016-07-17
        • 2018-07-13
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        相关资源
        最近更新 更多