Ruby正则表达式"直到空行"

时间:2016-06-24 18:10:13

标签: ruby regex

我有以下测试字符串:

puts "Wrong guess receives feedback"
p (game.guess(11) == "Too high!")

puts "Wrong guess deducts from remaining guesses"
p (game.remaining_guesses == 3)

在英语中我试图:

capture everything after "puts " 
until you get to a blank line
(aka beginning of a string followed immediately by end of string)

我知道如何直到你遇到某些事情"。例如,"直到你遇到双引号"

[6] pry(main)> re = /[^"]+/
=> /[^"]+/
[7] pry(main)> "stuff before a quote\"".slice(re)
=> "stuff before a quote"

我认为re = /^$/会"捕获一个空行" http://rubular.com/r/E5F7wH6sNq

那么我怎样才能抓住"'放置'直到你得到一个空行"?我尝试过以下方法:

re = /puts ([^^$]+)/

但它不起作用:http://rubular.com/r/yUhA090fLm

2 个答案:

答案 0 :(得分:1)

这是一种方法:

re = /puts (.*?)\r?\n\r?\n/m

.*表示“除换行符之外的任何字符为零或更多”。我稍后会解释?

最后的m(对于“多行”)修饰符使其意味着“包括换行符在内的任何字符的零或更多”。

\r?\n\r?\n连续两个换行符,说明它可以在不同的系统上以不同的方式表示。您可以使用$^替换此部分,但(.*?)最终将包含一个尾随换行符,因为“行尾”的$在换行符后匹配,而不是之前。

?使.*“懒惰” - 尽可能少地匹配,而不是“贪婪”并尽可能匹配。如果你有多个空行,这是相关的:你可能不希望它贪婪地匹配“直到最后一个空白行的任何字符的零或更多”;你希望它懒洋洋地匹配“零或更多的任何字符,直到第一个空行”。

/puts ([^^$]+)/的一个问题是[^abc]实际上是“任何一个不是a,b或c的字符”的快捷方式。它并不意味着“不是'a'后跟'b'后跟'c'”。

答案 1 :(得分:1)

str.scan /(?<=puts ).*?(?=\R\R|\z)/m                                                                                                           
#⇒ [
#    [0] "\"Wrong guess receives feedback\"\np (game.guess(11) == \"Too high!\")",
#    [1] "\"Wrong guess deducts from remaining guesses\"\np (game.remaining_guesses == 3)"
# ]

正面看待puts,然后是非贪婪的东西,直到两个回车/空行(注意\R任何平台上捕获后者,包括Win和MacOS ,)或输入结束。