"111".gsub(/1?/, "2")
=> "2222"
"111".gsub(/1/, "2")
=> "222"
"111".gsub(/1*/, "2")
=> "22"
"111".gsub(/1+/, "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
。