如何使用Ruby来匹配字符串?

时间:2019-07-17 00:35:17

标签: 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 - 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

2 个答案:

答案 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"]