ruby中的正则表达式,用于具有多个模式的字符串

时间:2011-05-09 06:47:19

标签: ruby regex

我有一个带有可选子字符串的字符串,我正在寻找/使用正则表达式/名称捕获,如果可能的话,为所有人提供单个正则表达式。

在RUBY

请帮忙,

示例字符串:

string1 = bike wash #a simple task
string2 = bike wash @ bike point # a simple task with location
string3 = bike wash @ bike point on 13 may 11 # task with location and date
string4 = bike wash @ bike point on 13 may 11 @ 10 AM # task with location, date and time
string5 = bike wash on 13 may 11 @ 10 AM # task with date and time without location
string6 = bike wash on 13 may 11 # task and date

我花了将近一天的时间在google和stackoverflow中为所有上述字符串模式获取单个正则表达式。

2 个答案:

答案 0 :(得分:4)

假设:

  • 地点和时间以@开头,@无处可见。
  • 日期以on开头,周围有强制性空格,on无处可出现。
  • 任务是强制性的。
  • 位置和日期是可选的,彼此独立。
  • 时间仅在有日期时出现。
  • 任务,地点,日期,时间仅按此顺序显示。

此外,应该理所当然地认为正则表达式引擎是oniguruma,因为提到了命名捕获。

regex = /
  (?<task>.*?)
  (?:\s*@\s*(?<location>.*?))?
  (?:\s+on\s+(?<date>.*?)
    (?:\s*@\s*(?<time>.*))?
  )?
\z/x

string4.match(regex)
# => #<MatchData
  "bike wash @ bike point on 13 may 11 @ 10 AM"
  task:     "bike wash"
  location: "bike point"
  date:     "13 may 11"
  time:     "10 AM"
>

答案 1 :(得分:2)

对于正则表达式来完成这项工作,需要做一些假设。任务不应包括“@”或“on”,例如,但可能还有更多。

要匹配任何字符,但第一个空格为“@”或“on”,我会使用(?! @ | on ). 所以你可以使用(((?! @ | on ).)+)找到任务。接下来是一个可选的位置,前缀为“@”:(?: @ ((?:(?! on ).)+))?。请注意,此处的位置不应包含“on”。

然后,有一个可选日期,可选时间为(?: on ((?:(?! @ ).)+)(?: @ (.+))?)?。一起来:

((?:(?! @ | on ).)+)(?: @ ((?:(?! on ).)+))?(?: on ((?:(?! @ ).)+)(?: @ (.+))?)?

这将在前四个捕获组中包含任务,位置,日期和时间。见这里:http://regexr.com?2tnb3