Ruby Regex:匹配直到第一次出现角色

时间:2014-04-22 21:51:53

标签: ruby regex

我的文件行的格式各不相同,但基本思路是这样的:

- 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)

我有什么办法可以做到这一点吗?谢谢!

2 个答案:

答案 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注意到我发布前不久需要.*非贪婪,但直到稍后才看到评论。