【问题标题】:How to extract a timestamp using a regex如何使用正则表达式提取时间戳
【发布时间】:2017-03-21 14:35:27
【问题描述】:

我需要从[02/24/2016][03:37:27.996]中提取时间戳。

例如匹配:

[02/24/2016][03:37:27.996] 

应该提取:

02/24/2016 03:37:27.996

这将分别返回日期和时间:

\[(?<date>[^\]]*)\]\[(?<time>[^\]]*)\]

这是 Rubular example 供您参考。

我正在寻找如何将这两个组(日期和时间)组合成时间戳。

【问题讨论】:

  • 这可以通过替换不必要的文本或使用一些代码来连接两组内容来实现。您不能只使用单个正则表达式模式来匹配两个不相邻的文本部分。
  • 只有正则表达式没有办法实现吗?
  • [一些占位符文本,因为你不能只写...] 不。
  • 欢迎来到 Stack Overflow。请在提问时花时间格式化您的问题以提高可读性。 Stack Overflow 是一本在线参考书,可读性、语法和拼写都很重要,无论是对于我们试图帮助您还是对于那些将来寻找相同问题的解决方案的人。

标签: ruby regex fluentd


【解决方案1】:

由于正则表达式的工作方式,您不能使用模式将信息提取为一个结果或字符串。您将获得两个捕获:

'[02/24/2016][03:37:27.996]'.match(/\[([^\]]+)\]\[([^\]]+)\]/).captures # => ["02/24/2016", "03:37:27.996"]

你可以这样使用:

'[02/24/2016][03:37:27.996]'.match(/\[([^\]]+)\]\[([^\]]+)\]/).captures.join(' ') # => "02/24/2016 03:37:27.996"

或一个包含干预"[]" 字符的捕获:

'[02/24/2016][03:37:27.996]'.match(/\[([^\]]+\]\[[^\]]+)\]/).captures # => ["02/24/2016][03:37:27.996"]

你也可以通过其他方式来做:

'[02/24/2016][03:37:27.996]'[1..-2].sub('][', ' ') # => "02/24/2016 03:37:27.996"

使用简单的切片和sub,我会这样做,或者:

[[1, 10], [13, 12]].map {|s, l| '[02/24/2016][03:37:27.996]'[s, l] }.join(' ') # => "02/24/2016 03:37:27.996"
'[02/24/2016][03:37:27.996]'.tr('[]', ' ').strip.squeeze(' ') # => "02/24/2016 03:37:27.996"
'[02/24/2016][03:37:27.996]'.gsub(/[\[\]]+/, ' ').strip # => "02/24/2016 03:37:27.996"
'[02/24/2016][03:37:27.996]'.scan(/[\d\/:.]+/).join(' ') # => "02/24/2016 03:37:27.996"

当人们了解正则表达式时,一切看起来都是使用它们的绝佳机会,一切都是用正则表达式锤子解决问题的机会。不幸的是,这并不接近事实。它们很强大,但是如果使用不当,它们会减慢您的代码速度,它们可能会引入非常细微的错误和逻辑漏洞,并且它们会使您的代码更难调试,因为随着它们变得越来越复杂,它们也会变得更加复杂。保持它们简单以保持理智,或学习如何使用为您组装它们的代码生成它们。

【讨论】:

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