Model: Web Browsing
Date: 2023-05-29
Rubyの正規表現に関して解せない現象が起きているので、以下のgistを見てください。Dの後に書いた結果がどうしてこうなるかを考えてもらえますか。 https://gist.github.com/hyuki/6e592f35444143e3893d35999cff62c9
Finished browsing ここでの正規表現について説明します。
/.+/
は1つ以上の任意の文字にマッチします。つまり、文字列全体にマッチします。/.*/
は0個以上の任意の文字にマッチします。つまり、文字列全体にマッチしますが、なにもない状態も含みます。/^.*/
は行の開始から0個以上の任意の文字にマッチします。つまり、こちらも文字列全体にマッチします。
Rubyのgsubメソッドは、正規表現にマッチした全ての部分を指定した文字列で置換します。この場合、正規表現で指定した部分が文字列全体であるため、gsubメソッドは文字列全体を置換します。
では、なぜ"D"
の出力が"betabeta"
となるのかを説明します。/.*/
の正規表現は、0個以上の任意の文字にマッチします。つまり、文字列の開始と終了の両方にマッチします。なぜなら、それらの位置には文字が0個あるからです。その結果、gsubメソッドは、文字列の開始と終了の両方で置換を行います。つまり、元の文字列(ここでは"alpha"
)を2回"beta"
に置換しています。その結果、"betabeta"
という出力が得られます。
"E"
の出力が"gamma"
となるのは、/^.*/
の正規表現が文字列の開始から0個以上の任意の文字にマッチするためです。つまり、文字列全体にマッチしますが、文字列の終了はマッチしません。そのため、gsubメソッドは文字列全体を一度だけ"gamma"
に置換します1。