我有一些像上面的字符串,我想获取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
答案 0 :(得分:1)
我假设文本是单个字符串(可能是从文件中读取的)。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container-fluid">
<div class="row justify-content-around">
<!-- Buttons -->
<div class="col-lg-4 button-section">
</div>
<!-- Appending on this section-->
<div class="col-lg-7 preview-section">
</div>
<p></p>
</div>
</div>
我们将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
我们可以使用以下正则表达式。
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)"
个对象。
Time
因此
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]
答案 1 :(得分:0)
此表达式很可能会在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}
,它也可以大大简化。
如果要浏览/简化/修改该表达式,请在this demo的右上角进行解释。
re = /(?<=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}/
str = '
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)'
str.scan(re) do |match|
puts match.to_s
end
["2019-07-13", "09:01", "2019-07-17", "08:59"]