我的文件行的格式各不相同,但基本思路是这样的:
- A block of text #tag @due(2014-04-20) @done(2014-04-22)
例如:
- Email John Doe #email @due(2014-04-20) @done(2014-04-22)
问题是#tag和@due日期没有出现在每个条目中,所以有些就像:
- Email John Doe @done(2014-04-22)
我正在尝试编写一个Ruby Regex,它在“ - ”和第一次出现的标签或@ done / @ due标签之间找到项目。
我一直在尝试使用群组并展望未来,但是当我有多个我正在展望的实例时,我似乎无法做到正确。使用我的第二个示例字符串,这个正则表达式:
/-\s(.*)(?=[#|@])/
为(。*):
产生此结果Email John Doe #email @due(2014-04-22)
我有什么办法可以做到这一点吗?谢谢!
答案 0 :(得分:7)
您错过了?
量词,使其成为非贪婪的匹配。我会从你的角色类中删除|
因为它试图匹配列表中的单个字符(#|@
)。
/-\s(.*?)(?=[#@])/
请参阅Demo
你真的不需要肯定前瞻,只需匹配这些字符并打印你的捕获组的结果。
/-\s(.*?)[#@]/
在这种情况下你也可以使用否定。
/-\s([^#@]*)/
答案 1 :(得分:2)
这应该这样做:
str = "- Email John Doe #email @due(2014-04-20) @done(2014-04-22)"
str[/-(.*?)#|@due|@done/,1]
#=> " Email John Doe "
(.*?)
是一个捕获组,?
使.*
非贪婪。捕获的结果由最后的,1
检索。
感谢@hwnd注意到我发布前不久需要.*
非贪婪,但直到稍后才看到评论。