Bug #1787

URI ライブラリの正規表現パターン

Added by drry   about 6 years ago. Updated over 4 years ago.

Status:Closed
Priority:Normal
Assignee:Yukihiro Matsumoto
ruby -v:ruby 1.9.1p243 (2009-07-16 revision 24174) [x86_64-linux] Backport:

Description

=begin
Ruby 1.9 の正規表現で \d の意味が変わっているので、全角数字が URI として通ってしまいます。URI が BINARY のみを対象にしているのであれば、この限りではありません。

irb(main):001:0> require "uri"
=> true
irb(main):002:0> URI("tag:example.jp:/紅玉")
URI::InvalidURIError: bad URI(is not URI?): tag:example.jp:/紅玉
from uri/common.rb:156:in split'
from uri/common.rb:174:in
parse'
from uri/common.rb:626:in parse'
from uri/common.rb:724:in
URI'
from (irb):2
from bin/irb:12:in `'
irb(main):003:0> URI("tag:example.jp:/1")
=> #
# Expected: => URI::InvalidURIError
irb(main):004:0> URI.escape("紅玉1.9")
=> "%E7%B4%85%E7%8E%89\xEF\xBC\x91%EF%BC%8E\xEF\xBC\x99"
# Expected: => "%E7%B4%85%E7%8E%89%EF%BC%91%EF%BC%8E%EF%BC%99"
=end

lib_uri_common-u.patch Magnifier (10.3 KB) drry  , 07/19/2009 12:34 AM

lib_uri_common-wu.patch Magnifier - for review (ignore all white space) (2.87 KB) drry  , 07/19/2009 12:34 AM

lib_uri_common.patch Magnifier (2.83 KB) drry  , 07/19/2009 01:24 AM

lib_uri_common-r2.patch Magnifier (13.2 KB) drry  , 07/19/2009 08:26 AM

lib_uri_common-r3.patch Magnifier - for r25291 (6.26 KB) drry  , 10/11/2009 01:55 AM

lib_uri_common-r3-w.patch Magnifier - ignore whole whitespace changes. (692 Bytes) drry  , 10/11/2009 01:55 AM

History

#1 Updated by drry   about 6 years ago

=begin
ごめんなさい、patch にまったく関係のない変更が混入しておりました。訂正します。
=end

#2 Updated by drry   about 6 years ago

=begin
たびたびすみません。別件で、初期化が適切でないために URI::Generic::PORT が /$/ になってしまっていることに気が付きました。そのため URI::Generic#port= が文字列を受け付けなくなっています。

URI.parse("http://example.jp/").port="81" #=> URI::InvalidComponentError

=end

#3 Updated by tadayoshi funaba about 6 years ago

=begin

Ruby 1.9 の正規表現で \d の意味が変わっているので、全角数字が URI として通ってしまいます。URI が BINARY のみを対象にしているのであれば、この限りではありません。

話が少しずれますが、標準ライブラリでは、少くとも scanf、time、date など
で同様の問題がでるように思います。一般に、\d が [0-9] ではなくなった事
態にどう対処するのが正しいでしょうか。

=end

#4 Updated by Yui NARUSE about 6 years ago

  • Assignee set to tadayoshi funaba

=begin

Ruby 1.9 の正規表現で \d の意味が変わっているので、全角数字が URI として通ってしまいます。URI が BINARY のみを対象にしているのであれば、この限りではありません。

話が少しずれますが、標準ライブラリでは、少くとも scanf、time、date など
で同様の問題がでるように思います。一般に、\d が [0-9] ではなくなった事
態にどう対処するのが正しいでしょうか。

個別具体的に、そのライブラリに置いて \d と [0-9] のどちらが「正しい」かを判断する事になります。
URIは許さない方がいいでしょうし、timeやdateでは許してもよいかもしれません。
=end

#5 Updated by tadayoshi funaba about 6 years ago

=begin

話が少しずれますが、標準ライブラリでは、少くとも scanf、time、date など
で同様の問題がでるように思います。一般に、\d が [0-9] ではなくなった事
態にどう対処するのが正しいでしょうか。

個別具体的に、そのライブラリに置いて \d と [0-9] のどちらが「正しい」かを判断する事になります。
URIは許さない方がいいでしょうし、timeやdateでは許してもよいかもしれません。

\d が一般化された意義は理解しますが、[0-9] と同等でなくなった事は、いい
事ばかりでもないように感じます。以前と同じ意味を表現したいが為にほとん
どすべての \d を [0-9] に置き換えるのは大変です。可読性、保守性の面でも
望ましくないと思います。

\d と書いて、[0-9] と同等であると示す方法があれば、[0-9] と書くよりよい
し、むしろ意図が明確になると思いますが、そういうものを検討する余地はあ
るでしょうか。

=end

#6 Updated by tadayoshi funaba about 6 years ago

  • Assignee changed from tadayoshi funaba to Yukihiro Matsumoto

=begin
どう考えても僕の担当すべき問題じゃないのでとりあえず変更
=end

#7 Updated by Yui NARUSE about 6 years ago

=begin
成瀬です。

Tadayoshi Funaba wrote:

話が少しずれますが、標準ライブラリでは、少くとも scanf、time、date など
で同様の問題がでるように思います。一般に、\d が [0-9] ではなくなった事
態にどう対処するのが正しいでしょうか。
個別具体的に、そのライブラリに置いて \d と [0-9] のどちらが「正しい」かを

判断する事になります。
URIは許さない方がいいでしょうし、timeやdateでは許してもよいかもしれません。

\d が一般化された意義は理解しますが、[0-9] と同等でなくなった事は、いい
事ばかりでもないように感じます。以前と同じ意味を表現したいが為にほとん
どすべての \d を [0-9] に置き換えるのは大変です。可読性、保守性の面でも
望ましくないと思います。

\d と書いて、[0-9] と同等であると示す方法があれば、[0-9] と書くよりよい
し、むしろ意図が明確になると思いますが、そういうものを検討する余地はあ
るでしょうか。

ちなみに、
:\d は \p{Nd}
Unicode Technical Report、Perl、Python、.NET
:\d は [0-9]
Java, ECMAScript
という感じのようです。

http://unicode.org/reports/tr18/
http://docs.activestate.com/activeperl/5.10/lib/pods/perlrecharclass.html
http://docs.python.org/3.1/library/re.html
http://msdn.microsoft.com/ja-jp/library/20bw873z(VS.80).aspx
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/regex/Pattern.html

--
NARUSE, Yui naruse@airemix.jp

=end

#8 Updated by Yukihiro Matsumoto about 6 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Bug #1787] URI ライブラリの正規表現パターン"
on Wed, 5 Aug 2009 05:14:13 +0900, "NARUSE, Yui" naruse@airemix.jp writes:

|> \d が一般化された意義は理解しますが、[0-9] と同等でなくなった事は、いい
|> 事ばかりでもないように感じます。以前と同じ意味を表現したいが為にほとん
|> どすべての \d を [0-9] に置き換えるのは大変です。可読性、保守性の面でも
|> 望ましくないと思います。
|>
|> \d と書いて、[0-9] と同等であると示す方法があれば、[0-9] と書くよりよい
|> し、むしろ意図が明確になると思いますが、そういうものを検討する余地はあ
|> るでしょうか。
|
|ちなみに、
|:\d は \p{Nd}
| Unicode Technical Report、Perl、Python、.NET
|:\d は [0-9]
| Java, ECMAScript
|という感じのようです。

ううむ。では、\d は [0-9] にしましょうか。で、:digit:
用意する?

=end

#9 Updated by Yui NARUSE about 6 years ago

  • Status changed from Open to Assigned

=begin
r24544にて\d,\s,\wを1.8仕様に戻しました。

なお、:digit:等は1.9ではもともと鬼車由来で存在します。
これらはUnicode系にマッチさせる際にはUnicodeを意識するままにしてあります。
http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
=end

#10 Updated by Yui NARUSE about 6 years ago

=begin
POSIX文字クラスはどうします?今はUnicodeの場合はUnicode意識になっていますが >まつもとさん
=end

#11 Updated by Yukihiro Matsumoto about 6 years ago

=begin
まつもと ゆきひろです

In message "Re: [Bug #1787] URI ライブラリの正規表現パターン"
on Sun, 16 Aug 2009 22:46:45 +0900, Yui NARUSE redmine@ruby-lang.org writes:

|POSIX文字クラスはどうします?今はUnicodeの場合はUnicode意識になっていますが >まつもとさん

:alnum:とかですか。Unicode意識でよいんじゃないでしょうか。

=end

#12 Updated by Yui NARUSE almost 6 years ago

  • Status changed from Assigned to Closed

=begin
とりあえずこの話は片付いたと思われるのでcloseします。
=end

#13 Updated by Yui NARUSE almost 6 years ago

=begin
成瀬です。

:alnum: のような、POSIX 文字クラスは、先日の話では、
以下の通り Unicode 準拠とするという話になりました。

2009/08/16 23:09, Yukihiro Matsumoto wrote:

In message "Re: [Bug #1787] URI ライブラリの正規表現パターン"
on Sun, 16 Aug 2009 22:46:45 +0900, Yui NARUSEredmine@ruby-lang.org writes:

|POSIX文字クラスはどうします?今はUnicodeの場合はUnicode意識になっていますが >まつもとさん

:alnum:とかですか。Unicode意識でよいんじゃないでしょうか。

一方で、Perl 5.11.0 でもこのスレッドと同旨の変更を行っているんですが、
こちらでは POSIX もオリジナルの定義に戻っています。

というわけで、Perl 5.11 に合わせませて、ASCII の範囲のみにしませんか。

参考:
POSIX Esc Class New-Property ! Old-Property
----------------------------------------------+-------------
alnum [0-9A-Za-z] IsPosixAlnum ! IsAlnum
alpha [A-Za-z] IsPosixAlpha ! IsAlpha
ascii [\000-\177] IsASCII = IsASCII
blank [\011 ] IsPosixBlank !
cntrl [\0-\37\177] IsPosixCntrl ! IsCntrl
digit \d [0-9] IsPosixDigit ! IsDigit
graph [!-~] IsPosixGraph ! IsGraph
lower [a-z] IsPosixLower ! IsLower
print [ -~] IsPosixPrint ! IsPrint
punct [!-/:-@[-`{-~] IsPosixPunct ! IsPunct
space [\11-\15 ] IsPosixSpace ! IsSpace
\s [\11\12\14\15 ] IsPerlSpace ! IsSpacePerl
upper [A-Z] IsPosixUpper ! IsUpper
word \w [0-9A-Z_a-z] IsPerlWord ! IsWord
xdigit [0-9A-Fa-f] IsXDigit = IsXDigit
http://cpansearch.perl.org/src/JESSE/perl-5.11.0/pod/perl5110delta.pod

--
NARUSE, Yui naruse@airemix.jp

=end

#14 Updated by Yukihiro Matsumoto almost 6 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Bug #1787] URI ライブラリの正規表現パターン"
on Tue, 6 Oct 2009 14:19:32 +0900, "NARUSE, Yui" naruse@airemix.jp writes:

|> :alnum:とかですか。Unicode意識でよいんじゃないでしょうか。
|
|一方で、Perl 5.11.0 でもこのスレッドと同旨の変更を行っているんですが、
|こちらでは POSIX もオリジナルの定義に戻っています。
|
|というわけで、Perl 5.11 に合わせませて、ASCII の範囲のみにしませんか。

うーん、そうするとPropertyを使ったプログラミングが難しくなり
ませんか。\p{Alnum}とかを使え、ということなのでしょうか。

でも、

|http://cpansearch.perl.org/src/JESSE/perl-5.11.0/pod/perl5110delta.pod

Previous versions of Perl tried to map POSIX style
character class definitions onto Unicode property names so
that patterns would "dwim" when matches were made against
latin-1 or unicode strings. This proved to be a mistake,
breaking character class negation, causing forward
compatibility problems (as Unicode keeps updating their
property definitions and adding new characters), and other
problems.

というもわからないでもないですねえ。どうしましょうか。

=end

#15 Updated by drry   almost 6 years ago

=begin
検討および対応していただき、どうもありがとうございます。

http://redmine.ruby-lang.org/issues/show/1787#note-2 の件もよろしくお願いします。
問題解決のための差分を添えておきます。(r3)
ついでにインデントの混在を整理した差分も添えてあります。(r3-w)
=end

Also available in: Atom PDF