Regex 如何使用ruby匹配字符串?

Regex 如何使用ruby匹配字符串?,regex,ruby,Regex,Ruby,我得到了一些类似上面的字符串,我想得到HHH的开始时间和结束时间,我不知道如何匹配预期的字符串。任何人都可以在正则表达式上帮助我实现这一点 AAA 2019-07-13 02:01 - 2019-07-17 01:59 CST (-5) BBB 2019-07-13 17:01 - 2019-07-17 16:59 AEST (+10) CCC 2019-07-13 15:01 - 2019-07-17 14:59 CST (+8) DDD 2019-07-13 15:01 - 2

我得到了一些类似上面的字符串,我想得到HHH的开始时间和结束时间,我不知道如何匹配预期的字符串。任何人都可以在正则表达式上帮助我实现这一点

AAA

2019-07-13 02:01 - 2019-07-17 01:59 CST (-5)

BBB

2019-07-13 17:01 - 2019-07-17 16:59 AEST (+10)

CCC

2019-07-13 15:01 - 2019-07-17 14:59 CST (+8)

DDD

2019-07-13 15:01 - 2019-07-17 14:59 CST (+8)

EEE

2019-07-13 15:01 - 2019-07-17 14:59 CST (+8)

FFF

2019-07-13 09:01 - 2019-07-17 08:59 CET (+2)

GGG

2019-07-13 09:01 - 2019-07-17 08:59 CET (+2)

HHH

2019-07-13 09:01 - 2019-07-17 08:59 CET (+2)

III

2019-07-13 03:01 - 2019-07-17 02:59 EST (-4)

JJJ

2019-07-13 03:01 - 2019-07-17 02:59 EST (-4)

KKK

2019-07-13 00:01 - 2019-07-16 23:59 PST (-7)

LLL

2019-07-13 15:01 - 2019-07-17 14:59 CST (+8)

MMM

2019-07-13 09:01 - 2019-07-17 08:59 CET (+2)


2019-07-13 07:01 UTC - 2019-07-17 06:59 UTC

此表达式可能会在
HHH
之后提取所需的日期和时间:

(?<=HHH)\s*(\s*\d{4}\s*-\s*\d{2}\s*-\s*\d{2})\s+(.+?)\s+-\s+(\s*\d{4}\s*-\s*\d{2}\s*-\s*\d{2}\s*)\s(.+?)\s+[A-Z]{3}

我假设文本是单个字符串(可能是从文件中读取的)

我们可以使用下面的正则表达式

r = /
    ^              # match the beginning of a line
    (?<=           # begin a positive lookbehind
      #{target}    # match the value of target
      \n           # match the end of the line
    )              # end the positive lookbehind
    .+             # match one or more characters
    /x             # free-spacing regex-definition mode
  #=>
    /
    ^
    (?<=
      HHH
      \n
    )
   .+
    /x
现在将其分解并获得所需的
时间
对象

require 'time'

f,t,z = s.split /\s-\s|\s+(?=\p{Lu})
  #=> ["2019-07-13 09:01", "2019-07-17 08:59", "CET (+2)"]
z = z[/[+-]\d+/] << '000'
  #=> "+2000" 
start_date, end_date = [f,t].map do |s|
  DateTime.strptime(s+z, '%Y-%m-%d %H:%M%Z')
end.map(&:to_time)
  #=> [2019-07-13 09:01:00 +2000, 2019-07-17 08:59:00 +2000]

这是一个字符串由一个变量持有,还是几个字符串,每个字符串由一个变量或数组的元素持有?如果是这样,您应该在引号中包含sting并分配变量。如果不是,它是文本文件的图像吗?如果是这样,每个非空行之间是否有空行?对于我的情况:
/^(?Re
\n\n
vs
\n
,我在评论中问过你,但你从未回复。这也是个好主意,谢谢Emma。
text =<<END
AAA
2019-07-13 02:01 - 2019-07-17 01:59 CST (-5)
BBB
2019-07-13 17:01 - 2019-07-17 16:59 AEST (+10)
CCC
2019-07-13 15:01 - 2019-07-17 14:59 CST (+8)
DDD
2019-07-13 15:01 - 2019-07-17 14:59 CST (+8)
EEE
2019-07-13 15:01 - 2019-07-17 14:59 CST (+8)
FFF
2019-07-13 09:01 - 2019-07-17 08:59 CET (+2)
GGG
2019-07-13 09:01 - 2019-07-17 08:59 CET (+2)
HHH
2019-07-13 09:01 - 2019-07-17 08:59 CET (+2)
III
2019-07-13 03:01 - 2019-07-17 02:59 EST (-4)
JJJ
2019-07-13 03:01 - 2019-07-17 02:59 EST (-4)
KKK
2019-07-13 00:01 - 2019-07-16 23:59 PST (-7)
LLL
2019-07-13 15:01 - 2019-07-17 14:59 CST (+8)
MMM
2019-07-13 09:01 - 2019-07-17 08:59 CET (+2)
2019-07-13 07:01 UTC - 2019-07-17 06:59 UTC
END
target = 'HHH'
r = /
    ^              # match the beginning of a line
    (?<=           # begin a positive lookbehind
      #{target}    # match the value of target
      \n           # match the end of the line
    )              # end the positive lookbehind
    .+             # match one or more characters
    /x             # free-spacing regex-definition mode
  #=>
    /
    ^
    (?<=
      HHH
      \n
    )
   .+
    /x
/^(?<=#{target}\n).+/
s = text[r]
  #=> "2019-07-13 09:01 - 2019-07-17 08:59 CET (+2)"
require 'time'

f,t,z = s.split /\s-\s|\s+(?=\p{Lu})
  #=> ["2019-07-13 09:01", "2019-07-17 08:59", "CET (+2)"]
z = z[/[+-]\d+/] << '000'
  #=> "+2000" 
start_date, end_date = [f,t].map do |s|
  DateTime.strptime(s+z, '%Y-%m-%d %H:%M%Z')
end.map(&:to_time)
  #=> [2019-07-13 09:01:00 +2000, 2019-07-17 08:59:00 +2000]
start_date
  #=> 2019-07-13 09:01:00 +2000
end_date
  #=> 2019-07-17 08:59:00 +2000