我有以下测试字符串:
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 ([^^$]+)/
答案 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 ,)或输入结束。