Project

General

Profile

Actions

Bug #1787

closed

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

Added by drry (drry  ) over 15 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
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")
=> #<URI::Generic:0x00000001673888 URL: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


Files

lib_uri_common-u.patch (10.3 KB) lib_uri_common-u.patch drry (drry  ), 07/19/2009 12:34 AM
lib_uri_common-wu.patch (2.87 KB) lib_uri_common-wu.patch for review (ignore all white space) drry (drry  ), 07/19/2009 12:34 AM
lib_uri_common.patch (2.83 KB) lib_uri_common.patch drry (drry  ), 07/19/2009 01:24 AM
lib_uri_common-r2.patch (13.2 KB) lib_uri_common-r2.patch drry (drry  ), 07/19/2009 08:26 AM
lib_uri_common-r3.patch (6.26 KB) lib_uri_common-r3.patch for r25291 drry (drry  ), 10/11/2009 01:55 AM
lib_uri_common-r3-w.patch (692 Bytes) lib_uri_common-r3-w.patch ignore whole whitespace changes. drry (drry  ), 10/11/2009 01:55 AM
Actions #1

Updated by drry (drry  ) over 15 years ago

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

Actions #2

Updated by drry (drry  ) over 15 years ago

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

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

=end

Actions #3

Updated by tadf (tadayoshi funaba) over 15 years ago

=begin

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

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

=end

Actions #4

Updated by naruse (Yui NARUSE) over 15 years ago

  • Assignee set to tadf (tadayoshi funaba)

=begin

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

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

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

Actions #5

Updated by tadf (tadayoshi funaba) over 15 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

Actions #6

Updated by tadf (tadayoshi funaba) over 15 years ago

  • Assignee changed from tadf (tadayoshi funaba) to matz (Yukihiro Matsumoto)

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

Actions #7

Updated by naruse (Yui NARUSE) over 15 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

=end

Actions #8

Updated by matz (Yukihiro Matsumoto) over 15 years ago

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

In message "Re: [ruby-dev:39017] Re: [Bug #1787] URI ライブラリの正規表現パターン"
on Wed, 5 Aug 2009 05:14:13 +0900, "NARUSE, Yui" 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

Actions #9

Updated by naruse (Yui NARUSE) over 15 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

Actions #10

Updated by naruse (Yui NARUSE) over 15 years ago

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

Actions #11

Updated by matz (Yukihiro Matsumoto) over 15 years ago

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

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

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

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

=end

Actions #12

Updated by naruse (Yui NARUSE) over 15 years ago

  • Status changed from Assigned to Closed

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

Actions #13

Updated by naruse (Yui NARUSE) about 15 years ago

=begin
成瀬です。

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

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

In message "Re: [ruby-dev:39088] [Bug #1787] URI ライブラリの正規表現パターン"
on Sun, 16 Aug 2009 22:46:45 +0900, Yui NARUSE 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

=end

Actions #14

Updated by matz (Yukihiro Matsumoto) about 15 years ago

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

In message "Re: [ruby-dev:39438] Re: [Bug #1787] URI ライブラリの正規表現パターン"
on Tue, 6 Oct 2009 14:19:32 +0900, "NARUSE, Yui" 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

Updated by drry (drry  ) about 15 years ago

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

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0