在正则表达式的第一次匹配后如何停止`scan`?

时间:2015-05-12 03:28:39

标签: ruby regex

我有:

bigtext = "I am happy. We are happy. He is happy too." 

我想扫描文本并在第一次出现时停止" happy"。

我试过了:

bigtext.scan(/happy?/) 

我使用?停止,但它继续scan,并返回三次" happy"。

4 个答案:

答案 0 :(得分:1)

...

validates :nested_1, # validations hash
validates :nested_2, # validations hash

...

您可以使用此^.*?happy m模式。请参阅演示。

https://regex101.com/r/oF9hR9/12

答案 1 :(得分:0)

/happy?/将匹配"happ""happy";您滥用?(可选匹配)运算符。

您想要的不是scan(全部出现),而是match=~甚至是[]

bigtext =~ /happy/
# => 5
bigtext.match(/happy/)
# => #<MatchData "happy"> 
bigtext[/happy/]
# => "happy"

答案 2 :(得分:0)

你到底想要达到什么目的?如果你想知道字符串是否包含单词&#34; happy&#34;,为什么不使用

find = "happy"
if bigtext.include?(find)
  return [find]

否则,如果需要正则表达式操作来返回数组

,则可以使用match
bigtext.match(/happy/).to_a #  returns ["happy"]

答案 3 :(得分:0)

scan中使用一个块,并在完成该块中的所有操作后放置break

没有break

bigtext.scan(/happy/) do
  p $`                                                                            #`
end
# >> "I am "
# >> "I am happy. We are "
# >> "I am happy. We are happy. He is "

使用break

bigtext.scan(/happy/) do
  p $`                                                                            #`
  break
end
# >> "I am "