[ruby-dev:39945] [Bug #2374] URI.regexp('http') が 'http://' にマッチする

From: Yui NARUSE <redmine@...>
Date: 2009-12-31 16:33:35 UTC
List: ruby-dev #39945
チケット #2374 が更新されました。 (by Yui NARUSE)


(2009/12/31 23:54), Tanaka Akira wrote:
> 2009年12月31日23:47 Yui NARUSE <redmine@ruby-lang.org>:
>>
>> URI を正規表現でパースするという発想自体にそもそも若干の無理があるように思うので、
>> URI.regexp は obsolete にしませんか
> 
> 無理というのは具体的にはどういう話でしょう?

まず、必ずしも正規表現でのパースが可能な事が保証されていない事です。
実際問題としてはたいていパース可能なのですが、
たとえば urn:isbn あたりはちょっと可能とは言わないでしょう。
http://www.din.or.jp/~ohzaki/regex.htm#ISBN

次に、スキームによって正規表現の中身を切り替える必要がある点です。
現状でもスキームを与える事はできますが、その結果はほとんど変わりません。
理屈の上ではそれぞれ切り替えるように変えればいいとも言えますが、
長期間現状で放置されてきたという現実があります。
現状は、個別のスキーマについて言えば誤った正規表現を提供しているわけで、
有害であるように感じます。

さらに、正規表現を返すという API は規格の更新に弱いです。
URI 全体に言える事ですが、内部実装を露出しすぎていて、
規格の更新に対応しづらくなっています。
URI.regexp の場合、取得した正規表現をマッチに使って $1 とかを取っている
うちは問題ありませんが、Regexp#source を呼び始めた瞬間互換性の確保が
極めて困難になります。

結局の所、現状に問題があるが、問題がない状態を維持するのは大変であり、
変えると互換性に問題が出る恐れがあるということになります。

で、わたしのこれへの対応案として、以下を提案するという事です。
* URI.regexp は現状を仕様としていじらない
* 長期的には obsolete として、きりのいいところで廃止
----------------------------------------
http://redmine.ruby-lang.org/issues/show/2374

----------------------------------------
http://redmine.ruby-lang.org

In This Thread

Prev Next