From: "NARUSE, Yui" Date: 2010-01-02T01:33:29+09:00 Subject: [ruby-dev:39947] Re: [Bug #2374] URI.regexp('http') が 'http://' にマッチする (2010/01/01 12:29), Tanaka Akira wrote: > 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.scan(text, schemes) 等の API にした上で、 RFC 3986 Appendix C. Delimiting a URI in Context にあるような折り返しの 考慮も必要な気もしないでもないですが。 >> さらに、正規表現を返すという API は規格の更新に弱いです。 >> URI 全体に言える事ですが、内部実装を露出しすぎていて、 >> 規格の更新に対応しづらくなっています。 >> URI.regexp の場合、取得した正規表現をマッチに使って $1 とかを取っている >> うちは問題ありませんが、Regexp#source を呼び始めた瞬間互換性の確保が >> 極めて困難になります。 > > URI.regexp は規格で使っている非終端記号の名前を使っていないぶん、 > むしろ規格の更新には強い気がします。 改めて URI.regexp の rdoc を読むと、$1 等の使用は非サポートなんですね。 ならば、規格の更新には強いですね。 -- NARUSE, Yui