如何解析文本并查找匹配的字符串

时间:2015-03-23 09:19:50

标签: ruby

我有这样的文字输入:

AXCGGV-102
A) some data
B) MSGH
E)Check Service MON-TUE 0515-2145 WED-THU 0515-2255
FRI 0515-2145 SAT 0645-1845 SUN 0645-2145
FINISH

AXCGKJ-103
A) some data
B) PBDR
E)Check Service MON-THU 0530-2115, FRI 0530-2000,
SAT 0730-1830, SUN 0730-2115.
FINISH

我想解析这个输入,我想要输出:

MSGH 0515-2145 0515-2145 0515-2255 0515-2255 0515-2145 0645-1845 0730-2115
PBDR  ..

以表格格式(即。B)值和E) Mon到Sun值)。我想知道如何解析这些数据。

1 个答案:

答案 0 :(得分:1)

在此代码中,我假设" E)"数据全部在一行:

wday = { "MON" => 1, "TUE" => 2, "WED" => 3,
         "THU" => 4, "FRI" => 5, "SAT" => 6, "SUN" => 7 }

File.readlines('data').each { |line|
  (print $1; next) if line.match(/^B\) (\w+)/)

  next if !line.match(/^E\)\s*Check Service\s*(.*)/)

  $1.scan(/(\S+) (\d+-\d+)/).each { |days, times|
    day1, day2 = days.split '-'
    ndays = (wday[day2] || wday[day1]) - wday[day1]

    (ndays + 1).times { print " " + times }
  }

  puts
}

使用您的样本数据输出为:

MSGH 0515-2145 0515-2145 0515-2255 0515-2255 0515-2145 0645-1845 0645-2145
PBDR 0530-2115 0530-2115 0530-2115 0530-2115 0530-2000 0730-1830 0730-2115

这是一个更通用的版本,用于解析" E)"直到" FINISH":

wday = { "MON" => 1, "TUE" => 2, "WED" => 3,
         "THU" => 4, "FRI" => 5, "SAT" => 6, "SUN" => 7 }

time_data = nil

File.readlines('data').each { |line|    
  if time_data
    (time_data += line; next) if !line.match(/^FINISH/)

    time_data.scan(/(\S+) (\d+-\d+)/).each { |days, times|
      day1, day2 = days.split '-'
      ndays = (wday[day2] || wday[day1]) - wday[day1]

      (ndays + 1).times { print " " + times }
    }

    time_data = nil; puts
    next
  end

  (print $1; next) if line.match(/^B\) (\w+)/)

  next if !line.match(/^E\)\s*Check Service\s*(.*)/)
  time_data = $1
}