仅提取所需的文字字段

时间:2017-11-18 10:29:59

标签: regex

我正在学习正则表达式,我利用一切机会了解它是如何工作的。目前我正在尝试从文本文件中提取日期(实际上是我手机中的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.

2 个答案:

答案 0 :(得分:1)

我建议这种模式:

(?:.*?|\G)(\d\d\.\d\d\.(?:\d{4})?)

这使用了\G标志,在这种情况下,允许从匹配的一开始就进行多次匹配,而不会让文本中出现任何单个不匹配的字符,从而允许删除除了所需内容之外的所有内容

如果您想删除多余的匹配项,请在结尾处添加|.*

(?:.*?|\G)(\d\d\.\d\d\.(?:\d{4})?)|.*

regex101 demo

在N ++中,确保选中带下划线的选项,并确保光标位于开头。在下面的图片中,我替换了替换,然后解除了替换,只是为了表明匹配被识别(16个替换)。

enter image description here

答案 1 :(得分:0)

您可以尝试使用以下模式:

\d{2}\.\d{2}\.(?:\d{4})?

这将匹配表单18.07.的day.month日期,但它也允许这样的日期后跟一个四位数的年份,例如18.07.2017。尽管使模式更具限制性是很好的,但是为了避免错误的火灾匹配,我没有看到任何明显可以添加到上述模式的东西。按照下面的演示链接查看实际模式。

Demo