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。