Skip to content

Instantly share code, notes, and snippets.

@hyuki

hyuki/chat.md Secret

Last active May 29, 2023 04:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hyuki/4576aa7cac4ece0f7ac24b55dc1fe219 to your computer and use it in GitHub Desktop.
Save hyuki/4576aa7cac4ece0f7ac24b55dc1fe219 to your computer and use it in GitHub Desktop.
#ChatGPT と結城浩の対話: Rubyの正規表現で解せない部分があったのでgistにコードをアップして説明してもらいました。

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​。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment