日期时间格式之间的正则表达式替换时间值

时间:2019-02-16 10:14:10

标签: regex regular-language

我有一个日期时间格式的XML文件,如下所示:

<published>2019-01-03T23:54:00.000+10:00</published>

还有这个

<published>2019-01-07T14:22:00.001+10:00</published>

,依此类推,时间值为23:54:00.000和14:22:00.001。

如何仅将time标记之间的<published></published>值替换为正则表达式?例如,我要将两个时间值都替换为03:00:00.000,因此第一个示例变为

<published>2019-01-03T03:00:00.000+10:00</published>

我的目标是使用任何现有的工具/应用程序Notepad ++或网站,因为它速度更快,而不是任何特定的编程语言。

2 个答案:

答案 0 :(得分:1)

尝试此正则表达式:

<% @scale = cookies[:scale] %>
<%= image_tag(@product.image_helper(@product.file, @scale.to_i, 352)) %>

Click for Demo

将每个匹配项替换为(<published>\d{4}(?:-\d{2}){2}T)\d{2}(?::\d{2}){2}\.\d{3}([^<]*<\/published>) ,即第1组的内容,后跟\103:00:00.000\2,然后是第2组的内容。

说明:

  • 03:00:00.000-匹配(<published>\d{4}(?:-\d{2}){2}T),后跟4位数字,再跟<published>,再跟2位数字,再跟-,再跟2位数字,再跟字母- 。该子比赛在第1组中被捕获
  • T-匹配格式为\d{2}(?::\d{2}){2}\.\d{3}的时间,其中XX:XX:XX.XXX是一个数字。
  • X-匹配0+次出现的不是([^<]*<\/published>)后跟<的任何字符。此子匹配项在第2组中捕获。

替换前: enter image description here

替换后: enter image description here

答案 1 :(得分:1)

首先,强制性警告不要尝试使用正则表达式解析xml / html。如果这是一次重新格式化的任务,并且您可以控制数据,那就很好。正则表达式解决方案将不会非常可靠...

那么,您将需要一个可以使用正则表达式处理捕获组的工具,以便可以在整个published标签上进行匹配并避免误报。像这样的正则表达式可以解决问题(根据您的工具调整捕获分组):

(\<published\>\d\d\d\d-\d\d-\d\dT)\d\d:\d\d:\d\d\.\d\d\d(\+\d\d:\d\d\<\/published\>)

请注意,以上是PCRE格式的正则表达式-demo on regex101。您可能需要进行调整以适合您的工具使用的格式。

在此正则表达式中,有两个捕获组,一个在您要替换的时间之前,一个在之后的时间。您可以在所选工具的替换字段中使用的示例字符串为:\103:00:00.000\2(使用\1语法进行反向引用)。