【问题标题】:How can I match two lines with the same regular expression?如何使用相同的正则表达式匹配两行?
【发布时间】:2021-10-17 11:00:38
【问题描述】:

我需要匹配这两个文本:

Last dying gasp time : -

Last dying gasp time : 2021-08-13 18:27:44

我尝试的是

  • Last dying gasp time\s+:\s+[\d-]+\s+[\d:]+
  • Last dying gasp time\s+:\s+[\d-]
  • Last dying gasp time\s+:\s+[\d-]+(\s+[\d:]+)?

但它只匹配其中一个。我怎样才能做到这一点?

【问题讨论】:

  • ...或者Last dying gasp time\s*:.*,如果您不特别关注冒号后面的内容。

标签: php regex regular-language


【解决方案1】:

您可以使用组引用\<n>,其中<n>是一个数字,表示匹配前面的组号(组必须匹配,所以不能提前匹配)

/(Last dying gasp time :).*\n\1.*/

首先将正则表达式包围成一个组...然后匹配行的其余部分(这是.* 的用途),然后匹配\n,然后引用在第一组匹配,\1,然后是该行的其余部分 (.*)。好消息是您不必强制使用固定字符串,因此您可以获得具有相同第一部分的所有行(并在此 demo 上演示):

(^[^:\n]+:).*(\n\1.*)*

这是一个组,从一行的开头开始,除了冒号或新行,后面是冒号,然后是(该组)由任意数量的新行序列组成的组,然后是最后一组匹配的字符串,后跟任意次数,直到换行。如果您只对至少包含两个重复标题的组感兴趣,只需将最后一个星号更改为加号即可。

(^[^:\n]+:).*(\n\1.*)+

【讨论】:

    【解决方案2】:

    你可以使用这个正则表达式:

    ^Last dying gasp time\h*:\h*(?:-|\d{4}(?:-\d{2}){2}\h+\d{2}(?::\d{2}){2})$
    

    RegEx Demo

    正则表达式详细信息:

    • ^:开始
    • Last dying gasp time:匹配文本Last dying gasp time
    • \h*:\h*:匹配:,两边各有0个或多个空格
    • (?:-|\d{4}(?:-\d{2}){2}\h+\d{2}(?::\d{2}){2}):匹配 - 或日期时间字符串
    • $:结束

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多