这个正则表达式`str.gsub(/\#{(.*?)} /)`做什么?

时间:2013-06-12 04:50:18

标签: ruby regex

.*表示任何字符,为什么以下需要.*?

str.gsub(/\#{(.*?)}/) {eval($1)}

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"