Ruby基礎教程 Programming 第四版
這本書的第十六章正則表達式類中有一個例子讓人不是那麼容易理解。特此分享一下我的理解。
16.5 捕獲
/(.)(\d\d)+(.)/ =~ "123456"
p $1 #=>1
p $2 #=>45
p $3 #=>6
此例子中的p $2 #=>45結果讓人有點難以理解,因爲大家都會認爲結果應該是23纔對,其實不然。經過試驗,書本並沒有出錯。正確的理解應該是+號代表重複一次以上,而$2捕獲的規則就是捕獲最後一次重複的結果,這是人家的規則,並無什麼道理可言。以下有一個例子可以用於參考驗證。
/(.)(\d\d)+?(.)/ =~ "123456"
p $1 #=>1
p $2 #=>23
p $3 #=>4
+?代表1次以上的重複中最短的部分,所以$2捕獲的就只有一次,結果就如上圖了。