正则表达式以不同格式捕获时间戳
Regex to capture timestamp in different formats
我的报告中有不同的时间格式。我正在尝试标准化格式。目前看到的两个如下
3. When: 150845Z - 161045Z Jan 16
When: 15 08:45Z - 16 10:45Z Jan 16
我的目标是将上述输入的数据转换为以下内容
Start date and time 01/15/2016 08:45
End date and time 01/16/2016 10:45
我有多个捕获组和拆分来实现这一点,老实说它相当大,我认为它可以简化。
我可以 post 我拥有的每一步代码,但是它确实会使 post 膨胀。
对于开始日期和时间,我执行以下操作
(?s)(?<=^.When:\s)[a-zA-Z0-9]+
对于结束日期和时间,我执行以下操作
When:.+(?<=- )(\w.*)
我真的很想尽可能减少这个。我尝试实现此方法 但是我对 Regex 真的很陌生,在我让它工作之前将项目拼凑在一起。
谢谢
附加信息
我目前不得不使用 Nintex Workflows 来转换数据。我想在 When:\s
之后开始捕获,然后我可以使用 [, :]
删除剩余的空格和冒号。这会将数据保留为我可以操作的格式。
你可以使用
^.*?When:\s*(\d{2})\s*(\d{2}):?(\d{2}Z)\s*-\s*(\d{2})\s*(\d{2}):?(\d{2}Z)\s*(\w+)\s*(\d{1,2})$
并替换为</code>。</p>
<p>见<a href="http://regexstorm.net/tester?p=%5E.%2A%3FWhen%3A%5Cs%2A(%5Cd%7B2%7D)%5Cs%2A(%5Cd%7B2%7D)%3A%3F(%5Cd%7B2%7DZ)%5Cs%2A-%5Cs%2A(%5Cd%7B2%7D)%5Cs%2A(%5Cd%7B2%7D)%3A%3F(%5Cd%7B2%7DZ)%5Cs%2A(%5Cw%2B)%5Cs%2A(%5Cd%7B1%2C2%7D)%5Cr%3F%24&i=3.%20When%3A%20150845Z%20-%20161045Z%20Jan%2016%0D%0AWhen%3A%2015%2008%3A45Z%20-%2016%2010%3A45Z%20Jan%2016&r=%241%242%243%244%245%246%247%248&o=m" rel="nofollow">regex demo</a></p>
<p>重点是匹配和捕获我们需要的内容,并在替换模式中借助反向引用(<code>$n
s)重新插入这些捕获的文本,我们刚刚匹配的那些部分将从结果中删除字符串.
这里有一些详细信息供您稍后调整模式:
^
- string/line 的开始(不知道该工具是否允许跨行匹配)
.*?
- 匹配除换行符以外的 0+ 个字符,尽可能少地匹配到第一个
When:
- 文字字符串 When:
\s*
- 0+ 个空格符号
(\d{2})
- 2 位数字(第 1 组)
\s*
- 0+ 个空格符号
(\d{2})
- 2 位数字(第 2 组)
:?
- 可选 :
(\d{2}Z)
- 2 位数字 + Z
(第 3 组)
\s*-\s*
- 0+ 空格,文字 -
和 0+ 空格
(\d{2})\s*(\d{2}):?(\d{2}Z)\s*
- 见上文(第 4、5、6 组)
(\w+)
- 1+ 个单词字符(字母、数字或下划线)(第 7 组)
\s*
- 0+ 个白色空间
(\d{1,2})
- 1 位或 2 位数字(第 8 组)
$
- 字符串结尾
我的报告中有不同的时间格式。我正在尝试标准化格式。目前看到的两个如下
3. When: 150845Z - 161045Z Jan 16
When: 15 08:45Z - 16 10:45Z Jan 16
我的目标是将上述输入的数据转换为以下内容
Start date and time 01/15/2016 08:45
End date and time 01/16/2016 10:45
我有多个捕获组和拆分来实现这一点,老实说它相当大,我认为它可以简化。
我可以 post 我拥有的每一步代码,但是它确实会使 post 膨胀。 对于开始日期和时间,我执行以下操作
(?s)(?<=^.When:\s)[a-zA-Z0-9]+
对于结束日期和时间,我执行以下操作
When:.+(?<=- )(\w.*)
我真的很想尽可能减少这个。我尝试实现此方法
谢谢
附加信息
我目前不得不使用 Nintex Workflows 来转换数据。我想在 When:\s
之后开始捕获,然后我可以使用 [, :]
删除剩余的空格和冒号。这会将数据保留为我可以操作的格式。
你可以使用
^.*?When:\s*(\d{2})\s*(\d{2}):?(\d{2}Z)\s*-\s*(\d{2})\s*(\d{2}):?(\d{2}Z)\s*(\w+)\s*(\d{1,2})$
并替换为</code>。</p>
<p>见<a href="http://regexstorm.net/tester?p=%5E.%2A%3FWhen%3A%5Cs%2A(%5Cd%7B2%7D)%5Cs%2A(%5Cd%7B2%7D)%3A%3F(%5Cd%7B2%7DZ)%5Cs%2A-%5Cs%2A(%5Cd%7B2%7D)%5Cs%2A(%5Cd%7B2%7D)%3A%3F(%5Cd%7B2%7DZ)%5Cs%2A(%5Cw%2B)%5Cs%2A(%5Cd%7B1%2C2%7D)%5Cr%3F%24&i=3.%20When%3A%20150845Z%20-%20161045Z%20Jan%2016%0D%0AWhen%3A%2015%2008%3A45Z%20-%2016%2010%3A45Z%20Jan%2016&r=%241%242%243%244%245%246%247%248&o=m" rel="nofollow">regex demo</a></p>
<p>重点是匹配和捕获我们需要的内容,并在替换模式中借助反向引用(<code>$n
s)重新插入这些捕获的文本,我们刚刚匹配的那些部分将从结果中删除字符串.
这里有一些详细信息供您稍后调整模式:
^
- string/line 的开始(不知道该工具是否允许跨行匹配).*?
- 匹配除换行符以外的 0+ 个字符,尽可能少地匹配到第一个When:
- 文字字符串When:
\s*
- 0+ 个空格符号(\d{2})
- 2 位数字(第 1 组)\s*
- 0+ 个空格符号(\d{2})
- 2 位数字(第 2 组):?
- 可选:
(\d{2}Z)
- 2 位数字 +Z
(第 3 组)\s*-\s*
- 0+ 空格,文字-
和 0+ 空格(\d{2})\s*(\d{2}):?(\d{2}Z)\s*
- 见上文(第 4、5、6 组)(\w+)
- 1+ 个单词字符(字母、数字或下划线)(第 7 组)\s*
- 0+ 个白色空间(\d{1,2})
- 1 位或 2 位数字(第 8 组)$
- 字符串结尾