【问题标题】:Regex to add leading zero in date record正则表达式在日期记录中添加前导零
【发布时间】:2016-09-06 15:24:41
【问题描述】:

问题 - 在日期记录中将前导零添加到单个数字中的正则表达式的最短形式是什么?

所以我想将 8/8/2014 8:04:34 转换为 08/08/2014 8:04:34 - 当只有一位数字时添加前导零。

记录可以有两个个位数的条目、一个个位数的条目或没有个位数的条目。一些记录的格式可以是 25/06/2014 19:50:18 或 9/06/2014 8:27:35 - 换句话说,其中一些记录可能已经标准化,正则表达式只需要修复单个数字条目。

无论如何都不是正则表达式用户。感谢您的帮助。

【问题讨论】:

    标签: regex notepad++


    【解决方案1】:

    感谢this最近的回答,我终于可以给你一个(希望是)正确的答案;)

    替换

    \b(?:(\d\d)|(\d))/(?:(\d\d)|(\d))/(\d\d)
    

    (?{1}\1:0$2)/(?{3}\3:0\4)/\5
    

    当只有一个或另一个是个位数时,它使用 Notepad++ 条件(直到我偶然发现提到的问题我才知道)来处理。

    正则表达式匹配单词边界\b,后跟两位数字,捕获在第 1 组中,匹配一位数字,捕获在第 2 组中,后跟 /。然后在第 3 组(2 位)或第 4 组(1 位)中对 day 重复相同的逻辑。最后,它会检查接下来的年份(至少两位数)。

    链接答案中解释了条件替换。但是,只需将(?{1} 测试,如果匹配到第 1 组,它会替换为 : 之前的表达式,否则替换为之后的表达式。

    希望这会有所帮助。

    问候

    【讨论】:

    • @FabioTurati 已修复 :)
    • 是的,我见过。实际上,在您发布此内容之前几秒钟,我就删除了我的评论:-)。我不得不说你的解决方案比我的要优雅得多,尽管我的更容易理解。我也不知道正则表达式中可能有条件,这就是我使用两个的原因。干得好,+1!
    【解决方案2】:

    怎么样:

    • Ctrl+H
    • 查找内容:\b(\d)(?=/)
    • 替换为:0$1
    • 全部替换

    这会将8/8/2014 8:04:34 更改为08/08/2014 8:04:34

    【讨论】:

    • 这非常简单和有效,但是你必须注意不受欢迎的匹配:OP说他想用08/08/2014 8:04:34替换8/8/2014 8:04:34,也就是说,只需要更改日期,但不是时间。您的解决方案还会更改时间(以及文件中的任何其他单个数字),因此必须谨慎使用。无论如何,这是一个很好的答案;如果您编辑您的答案并为此添加注释,您将获得我的支持。
    • @FabioTurati:你说得对,我已经用这种方式编辑了答案。
    【解决方案3】:

    使用以下regex 查找:

    (\d)(\d)?/(\d)(\d)?/(.*)

    然后用下面的替换:

    (?{2}\1\2:0\1)/(?{4}\3\4:0\3)/\5

    我们使用的称为regex 的条件。请参阅this 答案以获得解释。

    确保您已取消选中“.matches newline”复选框。

    【讨论】:

    • 这就是你问这个问题的原因...... :)
    • 如果您选择了“.matches newline”选项,这将不起作用,但如果您取消选择它,它会完美运行。
    • 您可以使用搜索缩短一些内容:(\d)?(\d/)(\d)?(\d/)(.*) 并替换 (?1\1:0)\2(?3\3:0)\4\5。不确定您是否真的需要检查最后一组。使用.*,它将不会匹配同一行中的第二个日期。
    【解决方案4】:

    首先,让我们做一些测试驱动开发并编写测试用例。我们可以忽略时间,只关注日期。此外,年份并不重要。我们必须找到当天和当月所有可能的情况。对于它们中的每一个,我们可以有:

    • 一位数
    • 两位数,其中第一位已经是0
    • 两位数,第一位不是0
    • 两位数,第二位是 0(可能不需要,但以防万一)。

    我们必须做某事的情况只是第一个,最后三个可以合并为一个,但我更喜欢将它们分开。我们需要测试 16 种组合:

    8/8/2014
    8/08/2014
    8/12/2014
    8/10/2014
    
    08/8/2014
    08/08/2014
    08/12/2014
    08/10/2014
    
    12/8/2014
    12/08/2014
    12/12/2014
    12/10/2014
    
    10/8/2014
    10/08/2014
    10/12/2014
    10/10/2014
    

    在所有这些中,只有 1、2、3、4、5、9、13 必须更改。我不知道如何使用单个正则表达式,但使用 2 个正则表达式很容易:

    当天的第一个正则表达式:

    (?<!\d)(\d/\d{1,2}/\d+)
    

    替换为:

    0\1
    

    它匹配只有一位数字的日期,然后是带有 1 或 2 天的月份,然后是带有任意位数的年份,并且它只是在开头添加 0

    本月的第二个正则表达式:

    (\d{2}/)(\d/\d+)
    

    替换为:

    \10\2
    

    这个假设第一个已经运行,因此一天有 2 个数字。它查找月份有一位数的日期,并在其前添加0。请注意\10\2 表示:匹配的第一组,然后是0,然后是第二组。这并不意味着:第十组,其次是第二组。所以10这两个数字在逻辑上是分开的。

    运行第一个,然后运行第二个,它给出了正确的结果:

    08/08/2014
    08/08/2014
    08/12/2014
    08/10/2014
    
    08/08/2014
    08/08/2014
    08/12/2014
    08/10/2014
    
    12/08/2014
    12/08/2014
    12/12/2014
    12/10/2014
    
    10/08/2014
    10/08/2014
    10/12/2014
    10/10/2014
    

    【讨论】:

      【解决方案5】:

      如果您有类似(ISO 格式)的日期

      2017-9-5
      

      这个

      replace(/(\D)(\d)(?!\d)/g, '$10$2')
      

      会把它变成

      2017-09-05
      

      并且会在日期中保留两位数字

      2017-11-11 or 2017-9-05
      

      【讨论】:

      • 这将改变时间8:27:35 => 08:27:35,这是不想要的
      • 将 \D(不是数字)替换为您需要的符号。所以它会变成像replace(/(^|\/)(\d)(?=\/|\s)/g, '$10$2')
      • 重读问题,他们想要在记事本++中使用正则表达式。此外,您是否在 OP 的示例中尝试过您的正则表达式(即8/8/2014 8:04:34)?
      • 是的。问题不在于记事本++(标签?正则表达式可以在任何地方使用)。 &gt; '8/8/2014 8:04:34'.replace(/(^|\/)(\d)(?=\/|\s|$)/g, '$10$2')'08/08/2014 8:04:34'
      【解决方案6】:

      一般方法是搜索(在本例中为 5 位数字):

      (\d)??(\d)??(\d)??(\d)??(\d)
      

      替换为

      (?1\1:0)(?2\2:0)(?3\3:0)(?4\4:0)\5
      

      【讨论】:

      • 鉴于8/8/2014 8:04:34 这会产生00008/00008/20104 00008:00004:30004,并不是真正想要的!
      【解决方案7】:

      您可以使用/^\d\/|(?&lt;=\/)\d\/\d/g 选择文本,然后在所选文本前添加 0,它应该适用于您的所有条件。

      【讨论】:

      • "then add 0 before selected text",很好,但是怎么做呢?
      • 我使用 javascript,它可以作为 "8/8/2014 8:04:34".replace(regex, str =&gt; `0${str}`) 完成,输出变为 08/08/2014 8:04:34。您应该能够在选择的文本之前添加一些内容,也可以使用其他语言/编辑器,尽管我不知道如何。对不起。
      • OP 要求使用 Notepad++ 解决方案。
      • 在这种情况下使用/^\d\/|(?&lt;=[\n\s])\d\/|(?&lt;=\/)\d\/\d/g 正则表达式,然后使用字符串0$&amp; 替换。在空格或新行之后添加了 (?&lt;=[\n\s])\d\/ 以匹配日期。字符串$&amp; 是正则表达式匹配的字符串。所以字符串0$&amp;根据需要在匹配的字符串之前添加0。 Here$0 字符串的引用堆栈溢出问题,here 是直接引用。
      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多