【问题标题】:Regex searching for time doesn't want to be non-greedy搜索时间的正则表达式不想不贪心
【发布时间】:2015-06-04 16:12:43
【问题描述】:

我正在尝试在 Spiceworks 中运行正则表达式来解析电子邮件标题,以选择第一个时间实例以进行票证分配。 正则表达式本身有效,但它会拾取所有时间实例,而不仅仅是一个。

这是正则表达式:\.*(0[1]|1[3-7]):\d\d:\d\d

我试图通过这样做来实现非贪婪:\.*?(0[1]|1[3-7]):\d\d:\d\d 但这似乎不起作用。将问号放在量词前面并没有为此做任何事情。

什么是使这个正则表达式不贪婪或只选择第一个实例的好解决方案?

谢谢,

安德鲁 N.

编辑:我试图从正则表达式中实现的是“13:04:57”而不是整个日期。

示例字符串: 收到:由 127.0.0.1 使用 SMTP id co5csp22954317qdb; 2015 年 5 月 6 日,星期三 13:02:22 -0700 (PDT) X-收到:由 127.0.0.1 发送,SMTP id 为 j185mr26699743oig.68.1430928141923; 2015 年 5 月 6 日,星期三 13:02:21 -0700(太平洋夏令时间)

【问题讨论】:

  • 你能发布一些示例数据吗?
  • 请将这些示例字符串添加到问题中并添加预期输出。另外,((?:0[1-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]).* 有帮助吗?只需抓取第一个捕获组的内容。
  • stribizhev - 一个仍然返回两个匹配项(在那个标题片段中)。
  • @user3761389:我上面的正则表达式将在时间之后返回整个字符串,但该值在捕获组内。
  • 我一定是在使用不同的正则表达式测试器。我明白你现在的意思了。看起来也做了我所追求的。谢谢!

标签: regex quantifiers non-greedy spiceworks


【解决方案1】:

您可以使用这个基于前瞻的正则表达式来匹配您的正则表达式匹配的时间的第一个实例:

/^(?:(?!(?:0[1]|1[3-7]):\d\d:\d\d).)*((?:0[1]|1[3-7]):\d\d:\d\d)/m

(?!...) 是一个负前瞻,它确保在匹配时间之前没有其他时间实例,因此仅匹配第一个实例。

RegEx Demo

【讨论】:

  • 做到了。谢谢!
  • 另外,您将如何从第一个实例开始解析?我注意到我从其他一些区域进一步向下移动页面(这将与正则表达式匹配:接收:由(ip)与 SMTP id(id);星期三,2015 年 5 月 6 日 08:58:05 -0700( PDT)
  • 08:58:05 也应该在该行中匹配。您可以使用我的演示链接并在那里提供示例数据。
【解决方案2】:

{1} 与前一个模式匹配 1 次。如果您发布示例标题,我可以测试 REGEX 以确保一切正确。请尝试以下操作。

(.*(0[1]|1[3-7]):\d\d:\d\d){1}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多