正则表达式在日期记录中添加前导零

时间:2016-05-11 09:54:34

标签: regex notepad++

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

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

记录可以有两个单个数字输入,一个单个数字输入或没有单个数字输入。有些记录可以采用25/06/2014 19:50:18或9/06/2014 8:27:35等形式 - 换句话说,其中一些记录可能已经标准化,正则表达式只需要修复单个数字输入。

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

6 个答案:

答案 0 :(得分:3)

怎么样:

  • 控制 + ħ
  • 找到:\b(\d)(?=/)
  • 替换为:0$1
  • 全部替换

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

答案 1 :(得分:3)

使用以下regex查找:

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

然后使用以下内容替换:

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

我们使用的是regex方面的条件。请参阅this答案以获取解释。

确保您取消选中“。匹配换行符”的复选框。

答案 2 :(得分: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位)中捕获。然后最后检查一年后(至少两位数)。

条件替换在链接的答案中解释。但是,如果匹配到组1,只需将(?{1}测试替换为:之前的表达式,否则替换为 if (savedInstanceState == null) { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); if (fragmentManager.findFragmentById(getFragmentActivityLayoutContainerId()) == null) { fragment = getNewFragmentInstance(); } else { fragment = fragmentManager.findFragmentById(getFragmentActivityLayoutContainerId()); fragmentTransaction.remove(fragment); fragmentManager.popBackStack(); fragmentTransaction.commit(); fragmentTransaction = fragmentManager.beginTransaction(); } fragmentTransaction.add(getFragmentActivityLayoutContainerId(), fragment); fragmentTransaction.commit(); } 之后的表达式。

希望这有帮助。

此致

答案 3 :(得分:1)

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

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

我们必须做某事的情况只是第一个,最后3个可以加入一个,但我更喜欢将它们分开。我们需要测试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

答案 4 :(得分:0)

如果您的日期(ISO格式)

2017-9-5

这个

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

会把它变成

2017-09-05

并保留日期中的两位数字,如

2017-11-11 or 2017-9-05

答案 5 :(得分:0)

一种通用方法是搜索(在这种情况下为5位数字):

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

替换为

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