Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby正则表达式:匹配直到字符第一次出现_Ruby_Regex - Fatal编程技术网

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 "