[英]How does gsub work with '*', '+' and '?'
"111".gsub(/1?/, "2")
=> "2222"
"111".gsub(/1/, "2")
=> "222"
"111".gsub(/1*/, "2")
=> "22"
"111".gsub(/1+/, "2")
=> "2"
為什么以及如何按上述方式運作?
第一個正則表達式匹配4次:每1
次匹配一次,最后一次在空字符串上匹配一次。
第二個正則表達式匹配3次,僅持續1
s。
第三個正則表達式一次匹配111
(貪心!),一次匹配最后一個空字符串 ( *
表示可選,因此空字符串也匹配!)
第四條正則表達式貪婪地獲取完整字符串,總共只匹配一次。 末尾不匹配,因為不再有(必需) 1
了。
您應該查找帶有正則表達式的貪婪匹配的概念。 這里有更多可供您嘗試的內容: /1*?/
和/1+?/
。 弄清楚為什么它們會像它們自己一樣匹配!
每次成功匹配之后,將掃描匹配之后的字符串部分以查找更多匹配。 甚至對一個空字符串也可以完成此操作(如果它不是先前匹配的一部分)。
還注意?
, *
和+
始終匹配盡可能多的字符(“貪心”)。
詳細:
"111".gsub(/1?/, "2")
第一個1
匹配->一個2
,第二個和第三個1
導致另外兩個2
s。 然后,空字符串匹配,再產生一個2
。
"111".gsub(/1/, "2")
這很明顯。
"111".gsub(/1*/, "2")
111
場比賽導致1 2
。 然后,空字符串匹配,再產生一個2
。
"111".gsub(/1+/, "2")
111
場比賽-> 1 2
空字符串不匹配,不再匹配2
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.