.*
表示任何字符,为什么以下需要.*?
?
str.gsub(/\#{(.*?)}/) {eval($1)}
答案 0 :(得分:7)
.*
是一个贪婪的匹配,而.*?
是一个非贪婪的匹配。有关它们的快速教程,请参阅this link。贪婪的比赛将尽可能多地匹配,而非贪婪的比赛将尽可能少地匹配。
在这个例子中,贪婪的变体抓住了第一个{
和最后一个}
(最后一个右括号)之间的所有内容:
'start #{this is a match}{and so is this} end'.match(/\#{(.*)}/)[1]
# => "this is a match}{and so is this"
虽然非贪婪变体读取的次数尽可能少,但只能在第一个{
和第一个}
之间读取。
'start #{this is a match}{and so is this} end'.match(/\#{(.*?)}/)[1]
# => "this is a match"