gsub如何使用'*','+'和'?'

时间:2011-12-06 13:34:26

标签: ruby regex

"111".gsub(/1?/, "2")
 => "2222" 

"111".gsub(/1/, "2")
 => "222"

"111".gsub(/1*/, "2")
 => "22"

"111".gsub(/1+/, "2")
 => "2"

为什么以及如何如上所述?

2 个答案:

答案 0 :(得分:5)

第一个正则表达式匹配4次:每次1一次,最后一次在空字符串上。

第二个正则表达式匹配3次,仅适用于1 s。

第三个正则表达式匹配111(贪婪!)一次,最后一次匹配空字符串*表示可选,所以空字符串也匹配!)

第四个正则表达式贪婪地接受完整的字符串,总共只匹配一次。结尾不匹配,因为没有(必需)1了。

您应该使用正则表达式查找贪婪匹配的概念。以下是您可以尝试的其他内容:/1*?//1+?/。弄清楚为什么这些匹配就像他们为自己做的那样!

答案 1 :(得分:2)

每次成功匹配后,将扫描匹配后的字符串部分以查找更多匹配项。甚至对空字符串也是如此(如果它不是前一个匹配的一部分)。

另请注意,?*+始终匹配尽可能多的字符(“贪婪”)。

详细说明:

"111".gsub(/1?/, "2")

第一次1次匹配 - >一个2,第二个和第三个1会导致另外两个2。 然后空字符串匹配,再产生一个2

"111".gsub(/1/, "2")

这很明显。

"111".gsub(/1*/, "2")

111匹配,产生一个2。然后,空字符串匹配,导致另外一个2

"111".gsub(/1+/, "2")

111匹配 - >一个2。空字符串不匹配,不再是2