2025-07-03 [長年日記]
_ URI::DEFAULT_PARSERの変更とmake_regexpメソッド
ひさびさにRubyの話。
warning: URI::RFC3986_PARSER.make_regexp is obsolete. Use URI::RFC2396_PARSER.make_regexp explicitly.
が出た。
結論としては、以下の書き換えをする。
# 修正前
regexp = URI.make_regexp
regexp = URI::RFC3986_PARSER.make_regexp
## 修正後
regexp = URI::RFC2396_PARSER.make_regexp
URI::RFC3986_PARSER.make_regexp
が廃止予定で、かわりにURI::RFC2396_PARSER.make_regexp
をつかうことの意。RFC3986の方が新しいのだから、逆なのでは?と思ったが、Gemeni 2.5Proが教えてくれた。
「Ruby 2.2.0以降、URIを解析するためのデフォルトのパーサーが、古いRFC 2396からより新しいRFC 3986に変更されました。RFC 3986は、角括弧([]
)を含むIPv6アドレスなど、より現代的なURI形式を正しく扱えるように仕様が更新されています。
しかし、make_regexp
メソッド(URIにマッチする正規表現を生成するメソッド)に関しては、互換性の問題から、デフォルトのパーサーがRFC 3986であっても、内部的には古いRFC 2396に基づいて正規表現を生成する仕様になっていました。」
コードを調べた結果、URI.make_regexp
も、URI::RFC3986_PARSER.make_regexp
もwarningが出るようになっていたので、将来削除される可能性がある。warning通り URI::RFC2396_PARSER.make_regexp
で書き換えるのが良いようだ。
URI.make_regexp
URI::RFC3986_PARSER.make_regexp
URI::RFC2396_PARSER.make_regexp
ちなみにURI::DEFAULT_PARSERは RFC2396_PARSER から RFC3986_PARSER へRuby3.4で変わるようだ。
変更はおそらくしばたさんのこのコミット。 https://github.com/ruby/ruby/commit/08e449d89baf1aeee87f084e1cd55bfe3b9cc46a
Ruby3.4では変わっている。 https://github.com/ruby/ruby/blob/v3_4_0/lib/uri/common.rb#L22
Ruby3.3ではまだRFC2396のようだ。 https://github.com/ruby/ruby/blob/v3_3_0/lib/uri/common.rb#L19-L24