【问题标题】:Regex to capture timestamp in different formats正则表达式以不同格式捕获时间戳
【发布时间】:2016-04-27 08:06:12
【问题描述】:

我的报告中有不同的时间格式。我正在尝试标准化格式。目前看到的两个如下。

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

我有多个捕获组和拆分来实现这一点,老实说,它相当大,我认为可以简化。

我可以发布我拥有的每一步代码,但它确实会让这篇文章变得臃肿。 对于开始日期和时间,我执行以下操作

(?s)(?<=^.When:\s)[a-zA-Z0-9]+

对于结束日期和时间,我执行以下操作

When:.+(?<=- )(\w.*)

我真的很想尽可能减少这种情况。我试图实现这个方法Regex for capturing different date formats 但是我对正则表达式真的很陌生,并且将项目拼凑在一起,直到我让它工作。

谢谢

附加信息

我目前必须使用 Nintex Workflows 来转换数据。我想在When:\s 之后开始捕获,然后我可以使用[, :] 删除剩余的空格和冒号。这会将数据保留为我可以操作的格式。

【问题讨论】:

  • 您的first regex 不起作用 - 您打算匹配什么?第二个刚刚得到-之后的部分:你不能把字符串分开吗?你真的不应该只搜索When:,获取它后面的子字符串并与" - " 拆分以获得你需要的部分吗?
  • 这就是我现在正在做的事情,但它工作得并不完全正确。我的目标是进行以下捕获。 Month, Start Date, End Date, Year, Start Time, End Time。我只是不确定如何拆分数据。
  • 首先查看this IDEONE demo。分裂好吗?如果不是,您想获得什么确切的输出?然后,检查此regex demo。好点了吗?
  • 查看您提供的正则表达式演示。它给了我一个想法。是否可以捕获从When: 之后开始的所有内容,然后删除所有空格和冒号?这将以我可以使用的方式格式化数据。

标签: .net regex replace nintex-workflow


【解决方案1】:

你可以使用

^.*?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})$

并替换为$1$2$3$4$5$6$7$8

regex demo

关键是匹配和捕获我们需要的内容,并在替换模式中借助反向引用 ($ns) 重新插入这些捕获的文本,而我们刚刚匹配的那些部分将从结果字符串中删除。

这里有更多细节供您稍后调整模式:

  • ^ - 字符串/行的开头(不知道该工具是否允许跨行匹配)
  • .*? - 匹配除换行符以外的 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 组)
  • $ - 字符串结束

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2014-01-02
    相关资源
    最近更新 更多