我正在学习正则表达式,我利用一切机会了解它是如何工作的。目前我正在尝试从文本文件中提取日期(实际上是我手机中的vnt文件类型)。它看起来如下:
BEGIN:VNOTE
VERSION:1.1
BODY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:18.07.=0A14.08.=0A15.09.=0A15.10.=
=0A13.11.=0A13.12.=0A12.01.=0A03.02. Grippe=0A06.03.=0A04.04.2015=0A0=
5.05.2015=0A03.06.2015=0A03.07.2015=0A02.08.2015=0A30.08.2015=0A28.09=
17.11.2017=0A
DCREATED:20171118T095601
X-IRMC-LUID:150
END:VNOTE
我想提取所有日期,以便最终列表如下:
18.07.
14.08.
15.09.
15.10.
等等。如果日期也是一年,也应该显示。
我几乎找到了如何通过以下正则表达式检测日期:
.+(\d\d\.\d\d\.(2015|2016|2017)?).+
但它只检测到很少的日期。结果如下:
BEGIN:VNOTE
VERSION:1.1
15.10.
04.04.2015
30.08.2015
24.01.2016
DCREATED:20171118T075601
X-IRMC-LUID:150
END:VNOTE
然后我尝试添加一个问号,使得。+不贪心,就我在教程中读到的那样。然后正则表达式看起来像:
.+?(\d\d\.\d\d\.(2015|2016|2017)?).+?
但结果仍然不是我想要的:
BEGIN:VNOTE
VERSION:1.1
21.03.20.04.18.05.18.06.18.07.14.08.15.09.15.10.
13.11.13.12.12.01.03.02.06.03.04.04.20150A0=
03.06.201503.07.201502.08.201530.08.20150A28.09=
28.10.201525.11.201528.12.201524.01.20160A
DCREATED:20171118T075601
X-IRMC-LUID:150
END:VNOTE
对于熟悉正则表达式的人,我很确定这很容易解决,但我不明白。当你不熟悉正则表达式时,这非常令人困惑。我尝试在一些教程或stackoverflow帖子中找到提示,但我发现的只有:Notepad++ how to extract only the text field which is needed? 但它对我不起作用。我认为它可能与我的文本文件不是单行的事实有关。
我也在regex101上有我的例子。 如果有人能给我一些暗示我还能尝试的其他内容,我将非常感激。
编辑:我想用正则表达式检测日期,因此有一个只包含日期的列表(也许它被称为替代?)
编辑2:很抱歉之前没有提到它:我只是想在例如中使用正则表达式Notepad ++或在线正则表达式测试网站。只是为了得到日期的结果并将结果保存在一个新的txt文件中。我不想在编程语言中使用正则表达式。我很抱歉不准确。
编辑3:结果应该是一个包含日期的列表,每个日期都在一个新行中: 我想提取所有日期,以便最终列表如下:
18.07.
14.08.
15.09.
15.10.
答案 0 :(得分:1)
我建议这种模式:
(?:.*?|\G)(\d\d\.\d\d\.(?:\d{4})?)
这使用了\G
标志,在这种情况下,允许从匹配的一开始就进行多次匹配,而不会让文本中出现任何单个不匹配的字符,从而允许删除除了所需内容之外的所有内容
如果您想删除多余的匹配项,请在结尾处添加|.*
:
(?:.*?|\G)(\d\d\.\d\d\.(?:\d{4})?)|.*
在N ++中,确保选中带下划线的选项,并确保光标位于开头。在下面的图片中,我替换了替换,然后解除了替换,只是为了表明匹配被识别(16个替换)。
答案 1 :(得分:0)
您可以尝试使用以下模式:
\d{2}\.\d{2}\.(?:\d{4})?
这将匹配表单18.07.
的day.month日期,但它也允许这样的日期后跟一个四位数的年份,例如18.07.2017
。尽管使模式更具限制性是很好的,但是为了避免错误的火灾匹配,我没有看到任何明显可以添加到上述模式的东西。按照下面的演示链接查看实际模式。