正则表达式以不同格式捕获时间戳

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>$ns)重新插入这些捕获的文本,我们刚刚匹配的那些部分将从结果中删除字符串.

这里有一些详细信息供您稍后调整模式:

  • ^ - 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 组)
  • $ - 字符串结尾