Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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_Regex Greedy - Fatal编程技术网

Ruby 如何在短语中第一次出现时停止正则表达式(使其成为贪婪的)

Ruby 如何在短语中第一次出现时停止正则表达式(使其成为贪婪的),ruby,regex,regex-greedy,Ruby,Regex,Regex Greedy,我正在尝试构建一个在第一次出现时停止的正则表达式。我知道我可以通过放置?使它不贪婪 考虑一个字符串: "This is sample text located at first line and located at second line." 在这里,我使用pattern2搜索pattern1 pattern1是的“文本” pattern2位于“ 在上面的字符串中,我想提取“text”,我的搜索模式是位于“”的,因此我使用以下正则表达式: /is.*sample(.*)located a

我正在尝试构建一个在第一次出现时停止的正则表达式。我知道我可以通过放置
使它不贪婪

考虑一个字符串:

"This is sample text located at first line and located at second line."
在这里,我使用
pattern2
搜索
pattern1

  • pattern1
    的“文本”
  • pattern2
    位于“
在上面的字符串中,我想提取
“text”
,我的搜索模式是位于“”的
,因此我使用以下正则表达式:

/is.*sample(.*)located at?/

如何使位于
不贪婪?我正在使用验证我的正则表达式。

您的正则表达式不正确

如果您希望在第一个“位于”之前出现一个“单词”,可以使用:

"This is sample text located at first line and located at second line."[/(\S+)\s+located at/, 1]
=> "text"
"This is sample text located at first line and located at second line."[/sample\s+(.+?)\s+located at/, 1]
=> "text"
我将“单词”定义为使用
\S
的非空白字符,所以标点符号和数字将包含在字母字符中。可以使用其他类,如
\w
,如果您需要
[A-Za-z0-9.]
。否则使用
[a-z]
如下:

"This is sample text located at first line and located at second line."[/([a-z]+)\s+located at/i, 1]
=> "text"
如果您想要任何出现在“示例”和第一个“位于”之间的文本,您可以使用:

"This is sample text located at first line and located at second line."[/(\S+)\s+located at/, 1]
=> "text"
"This is sample text located at first line and located at second line."[/sample\s+(.+?)\s+located at/, 1]
=> "text"
在位于?/
的模式
/test.*示例(.*)中,您使用的是多个
*
,这意味着任何内容都不存在或更多(但是,根据上下文,实际上并不是任何内容,但这比我们现在需要做的更深入)。“更多”是你正在碰撞的部分,因为它是贪婪的。而且,因为你用了两次,它就加倍贪婪了。您可以通过添加
来使用“非贪婪”变体,但它仍然不能正常工作,因为您给正则表达式引擎太多的束缚。我的模式将这一切都收紧,减少了在前两种模式中使用
修饰符的需要

我的第三个例子需要它,因为,
+
同样是贪婪的,需要加以调节


最后,模式中的
at?
没有应用
来修改
*
,它作用于前面的
t
,导致引擎出现“必须找到零或一个't',这不是您想要的,因为这将匹配“a”或“at”.

您的正则表达式无法处理示例输入,因为您希望在
测试
之后查找
示例
(即使
测试
应该是
文本
)。如果你想用
使某个东西不发音,你必须把
放在量词后面,比如
*?
。如果您不只是链接rubular,而是链接您在rubular上的实际测试示例(单击页面底部的
make permalink
)@m.buettner抱歉,我得到了解决方案。