From: Tanaka Akira Date: 2010-01-01T12:29:40+09:00 Subject: [ruby-dev:39946] Re: [Bug #2374] URI.regexp('http') が 'http://' にマッチする 2010年1月1日1:33 Yui NARUSE : > > まず、必ずしも正規表現でのパースが可能な事が保証されていない事です。 > 実際問題としてはたいていパース可能なのですが、 > たとえば urn:isbn あたりはちょっと可能とは言わないでしょう。 > http://www.din.or.jp/~ohzaki/regex.htm#ISBN べつに完全でなくても役に立てばいいんじゃないですかねぇ。 テキストの中から URI を探したいっていうのはいかにもありそうな話ですし。 なお、ISBN については鬼車で \g を使えばずいぶんと短くできると思います。 というか、ISBN は \g を要望したときに使った例でもあります。[ruby-dev:16732] > 次に、スキームによって正規表現の中身を切り替える必要がある点です。 > 現状でもスキームを与える事はできますが、その結果はほとんど変わりません。 > 理屈の上ではそれぞれ切り替えるように変えればいいとも言えますが、 > 長期間現状で放置されてきたという現実があります。 > 現状は、個別のスキーマについて言えば誤った正規表現を提供しているわけで、 > 有害であるように感じます。 正規表現では記述できない可能性を考えるならむしろそれは必然的な仕様なのでは? URI.regexp はおおざっぱに取り出して、正しいかどうかはさらに URI.parse で確認 する必要があるのでしょう。 さらには uri ライブラリが知らない scheme については URI.parse でも確認できない ので、やはり完全に正しいかどうか確認する機能を提供するという考えかた自体に無理 がある気がします。 > さらに、正規表現を返すという API は規格の更新に弱いです。 > URI 全体に言える事ですが、内部実装を露出しすぎていて、 > 規格の更新に対応しづらくなっています。 > URI.regexp の場合、取得した正規表現をマッチに使って $1 とかを取っている > うちは問題ありませんが、Regexp#source を呼び始めた瞬間互換性の確保が > 極めて困難になります。 URI.regexp は規格で使っている非終端記号の名前を使っていないぶん、 むしろ規格の更新には強い気がします。 なお、source を使って中身を調べるのはあからさまに無保証な感じがします。 具体的に、source を使っていて、URI.regexp を変えると困ることになる アプリケーションってあるんですか? > 結局の所、現状に問題があるが、問題がない状態を維持するのは大変であり、 > 変えると互換性に問題が出る恐れがあるということになります。 > > で、わたしのこれへの対応案として、以下を提案するという事です。 > * URI.regexp は現状を仕様としていじらない > * 長期的には obsolete として、きりのいいところで廃止 その場合、実際に URI.regexp を使っているアプリケーションはどのように変更する ことが推奨されるんですか? -- [田中 哲][たなか あきら][Tanaka Akira]