Thursday, 10 March 2016

ruby - What does this regex `str.gsub(/#{(.*?)}/)` do?




.* means any character, so why is the .*? needed in the following?



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

Answer



.* is a greedy match, whereas .*? is a non-greedy match. See this link for a quick tutorial on them. Greedy matches will match as much as they can, while non-greedy matches will match as little as they can.




In this example, the greedy variant grabs everything between the first { and the last } (the last closing brace):



'start #{this is a match}{and so is this} end'.match(/\#{(.*)}/)[1]
# => "this is a match}{and so is this"


while the non-greedy variant reads as little as it needs to make the match, so it only reads between the first { and the first successive }.



'start #{this is a match}{and so is this} end'.match(/\#{(.*?)}/)[1]
# => "this is a match"


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...