Ruby正则表达式:匹配直到字符第一次出现
我有一个文件,其中的行格式各不相同,但基本思想如下:Ruby正则表达式:匹配直到字符第一次出现,ruby,regex,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) 问题是#标签和@due date不会出现在每个条目中,因此有些条目就像: - Email John Doe @done(2014-04-22) 我正在尝试编写一个Ruby正则表达式,在“-”和has
- 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)
问题是#标签和@due date不会出现在每个条目中,因此有些条目就像:
- Email John Doe @done(2014-04-22)
我正在尝试编写一个Ruby正则表达式,在“-”和hashtag或@done/@due标记的第一个匹配项之间查找该项
我一直在尝试使用小组和展望未来,但当有多个我展望未来的实例时,我似乎无法正确地做到这一点。使用我的第二个示例字符串,这个正则表达式:
/-\s(.*)(?=[#|@])/
为(*)生成此结果:
我有没有办法把这件事做好?谢谢 您缺少了
?
量词,使其成为非贪婪匹配。我将从您的character类中删除
,因为它试图从字面上匹配列表中的单个字符(| |@
)
/-\s(.*?)(?=[#@])/
看
在这里,你真的不需要一个积极的前瞻,只要匹配这些角色并打印你的捕获组的结果就可以了
/-\s(.*?)[#@]/
在这种情况下,你也可以使用否定
/-\s([^#@]*)/
这应该做到:
str = "- Email John Doe #email @due(2014-04-20) @done(2014-04-22)"
str[/-(.*?)#|@due|@done/,1]
#=> " Email John Doe "
(.*?
是一个捕获组,?
使*
非贪婪。捕获结果由末尾的,1
检索
@hwnd在我发布之前不久就注意到需要将
*
设置为非贪婪匹配,但我直到后来才看到评论。您错过了?
以使其成为非贪婪匹配。酷。只是为了进一步研究,无论是否使用管道,结果都是一样的。我的理解是,管道就像“或”。对吗?在字符类之外,(?=#|@)
str = "- Email John Doe #email @due(2014-04-20) @done(2014-04-22)"
str[/-(.*?)#|@due|@done/,1]
#=> " Email John Doe "