我有一个带有可选子字符串的字符串,我正在寻找/使用正则表达式/名称捕获,如果可能的话,为所有人提供单个正则表达式。
在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中为所有上述字符串模式获取单个正则表达式。
答案 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