我有一个日期时间格式的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 ++或网站,因为它更快,而不是任何特定的编程语言。
首先,强制警告不要尝试用正则表达式解析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
语法进行反向引用)。
试试这个正则表达式:
(<published>\d{4}(?:-\d{2}){2}T)\d{2}(?::\d{2}){2}\.\d{3}([^<]*<\/published>)
用\103:00:00.000\2
替换每个匹配,即第1组内容,然后是03:00:00.000
,然后是第2组内容。
说明:
(<published>\d{4}(?:-\d{2}){2}T)
- 匹配<published>
,然后是4位数字,接着是-
,接着是2位数字,接着是-
,接着是2位数字,接着是字母T
。该子匹配在第1组中捕获\d{2}(?::\d{2}){2}\.\d{3}
- 匹配格式XX:XX:XX.XXX
的时间,其中X
是一个数字。([^<]*<\/published>)
- 匹配任何不是<
,然后是</published>
的任何字符的出现次数。该子匹配在第2组中捕获。