Revert 1.9 \w limitation to ASCII

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

\de$B$,e(B[0-9]e$B$KJQ99$5$l$?$H$-$K!“F1;~$Ke(B \w
e$B$be(BASCIIe$B$NHO0O$K8BDj$5e(B
e$B$l$^$7$?$,!”$3$l$Oe(B 1.8 e$B$H$NBg$-$JHs8_49@-$K$J$j$=$&$G$9!#e(BEUC
e$B$de(BSJISe$B$K$$$$F$O!"e(B1.8e$BF1MM!"Hse(BASCIIe$B$NJ8;z$Oe(B \w
e$B$K4^$`$Y$-$G$Oe(B
e$B$J$$$G$7$g$&$+!#$^$?!"e(BUnicodee$B$K$
$$$F$O!"%-%c%i%/%?%G!<%?%Y!<e(B
e$B%9$,$"$k$N$G!"e(BUnicodee$BE*$K%-%c%i%/%?$J$b$N$rBP>]$K$9$k$N$,NI$$e(B
e$B$H;W$$$^$9!#e(B

(2010/03/30 22:37), Yukihiro M. wrote:

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

\de$B$,e(B[0-9]e$B$KJQ99$5$l$?$H$-$K!“F1;~$Ke(B \w e$B$be(BASCIIe$B$NHO0O$K8BDj$5e(B
e$B$l$^$7$?$,!”$3$l$Oe(B 1.8 e$B$H$NBg$-$JHs8_49@-$K$J$j$=$&$G$9!#e(BEUC
e$B$de(BSJISe$B$K$$$$F$O!"e(B1.8e$BF1MM!"Hse(BASCIIe$B$NJ8;z$Oe(B \w e$B$K4^$`$Y$-$G$Oe(B
e$B$J$$$G$7$g$&$+!#$^$?!"e(BUnicodee$B$K$
$$$F$O!“%-%c%i%/%?%G!<%?%Y!<e(B
e$B%9$,$”$k$N$G!"e(BUnicodee$BE*$K%-%c%i%/%?$J$b$N$rBP>]$K$9$k$N$,NI$$e(B
e$B$H;W$$$^$9!#e(B

e$B!VBg$-$JHs8_49@-$K$J$j$=$&$G$9!W$H$$$&$N$O2?$+6qBNE*$J%U%#!<%I%P%C%/$,e(B
e$BGX7J$K$“$k$H;W$C$F$$$k$N$G$9$,!”$I$N$h$&$J%U%#!<%I%P%C%/$G$7$g$&$+!#e(B

e$B$^$:!"e(BEUC e$B$de(B SJIS e$B$KBP$7$F$N$b$N$@$H2>Dj$7$^$9!#e(B

e$B$3$N>l9g!“!Ve(BEUC e$B$de(B
SJISe$B!W$H$O6qBNE*$K$O2?$+$H$$$&$3$H$,LdBj$K$J$k$G$7$g$&!#e(B
Shift_JIS, Windows-31J, EUC-JP, CP51932, eucJP-ms e$B$”$?$j$Oe(B
e$BEvA34^$^$l$k$H$7$F!"3(J8;z7Oe(B SJIS
e$B$J$s$+$b4^$^$l$k$N$G$7$g$&$+$M!#e(B
e$B$b$C$H?J$a$k$H!"e(BCP949 e$B$H$+e(B EUC-CN e$B$H$+$O!“e(B1.8
e$B$G$Oe(B SJIS/EUC e$B$G07$C$F$$$?e(B
e$B2DG=@-$,9M$($i$l$^$9$,!”$3$l$O$I$&$9$k$N$G$7$g$&!#e(B

e$B$^$?!“e(BEUC e$B$He(B SJIS e$B7O$N$_$H$$$&$N$O0l4S@-$K7g$1$^$9!#e(B
e$BMxJX@-$N$?$a$J$i0l4S@-$r7g$/$3$H$b$$$H$o$J$$$N$,e(B Ruby
e$B$N;Q@*$G$O$”$j$^$9$,!“e(B
e$BF|K\8l7O$@$1$H$$$&$N$O@5D>$$$+$,$J$b$N$+$H;W$$$^$9!#e(B
e$B$H$$$&$o$1$G!”$3$NJ}8~$G9T$/$J$i$P!"e(Bnon ASCII non Unicode
e$B$N>l9g$O!"e(B
e$B$KJQ$($?J}$,$$$$$h$&$K46$8$^$9!#e(B

e$B<!$K!“e(BUnicodee$B!”$H$$$&$+e(B UTF8
e$B$KBP$7$F$N$b$N$@$H2>Dj$7$^$9!#$3$3$G!"e(B

Unicodee$B$K$$$$F$O!“%-%c%i%/%?%G!<%?%Y!<e(B
e$B%9$,$”$k$N$G!"e(BUnicodee$BE
$K%-%c%i%/%?$J$b$N$rBP>]$K$9$k$N$,NI$$e(B
e$B$H;W$$$^$9!#e(B
e$B$r:NMQ$9$k$H!"$9$0$K$O5$$E$-$E$i$$$,<B:]$KLdBj$,=P$k$H$$$&!"e(B
e$BLq2p$J8_49@-LdBj$rAH$_F~$l$k$3$H$K$J$j$^$9!#e(B

e$B$H$$$&$N$b!"8e$KB>$N8@8l$G$Ne(B \w
e$B$NCf?H$r=P$7$F$$$^$9$,!"IaDL$O$3$Ne(B
e$B!Ve(BUnicodee$BE*$K%-%c%i%/%?$J$b$N!W$O5-9f$NN`$r4^$$^$;$s!#e(B
e$B$A$J$
$K!"e(BBug #3047
e$B$O0lB-Aa$/$=$l$r4|BT$7$F$,$C$+$j$7$F$$$kNc$G$9!#e(B
http://redmine.ruby-lang.org/issues/show/3047

1.9 e$B$Ge(B \w
e$B$r!Ve(BUnicodee$BE*$K%-%c%i%/%?$J$b$N!W$K$9$k$H$3$N5U!"e(B
e$B6qBNE*$K$O:#$^$G%^%C%A$7$F$$$?0lIt$NJ8;z$,%^%C%A$7$J$/$J$j$^$9!#e(B
e$B$3$l$Oe(B non ASCII e$B$,A4$F%^%C%A$7$J$/$J$ke(B
(e$B$1$I$9$0$K5$$E$/e(B)
e$B8=:_$N<BAu$h$j$?$A$,0-$$$N$G$O$J$$$G$7$g$&$+!#e(B
e$B$D$^$j!"8_49@-$,M}M3$J$i$P$3$N0F$OL5$$$H;W$&$N$G$9!#e(B

e$B$^$H$a$k$H!“8_49@-$,M}M3$J$i$P%(%s%3!<%G%#%s%0$K8B$i$:!“e(B
(e$B$H$O8@$C$F$be(B non dummy encoding e$B$K$J$j$^$9$,e(B)
[a-zA-Z_0-9] + non ASCII (= /[a-zA-Z_0-9\P{ASCII}]/)
e$B$,@52r$G$7$g$&!#e(B
Ruby e$B$NJ8K!E*$K$b$3$l$O<1JL;R$K;H$($kL>A0$H0lCW$9$k$N$G0UL#$,e(B
e$B$J$-$K$7$b$”$i$:$G$”$k$h$&$K$O;W$$$^$9!#e(B

e$B$J$*!"8_49@-$H$OJL$K=q$-$d$9$5$NLL$Ge(B \w
[email protected];z$C$]$$$N$Ke(B
e$B%^%C%A$7$FM_$7$$$H$$$&<gD%$J$i$PJL$N5DO@$G!"0J2<$N$h$&$J46$8$K$J$j$^$9$+!#e(B

  1. \w e$B$@$1FCJL07$$$7$?$$e(B
  2. \w e$B$@$1e(B Unicode e$B$O5$;}$A0-$$e(B
    2a. [:word:] e$B;H$C$F$he(B
    2b. \d e$B$He(B \s e$B$be(B Unicode e$B;V8~$KLa$=$&$<e(B

= Ruby 1.8
ASCII: [a-zA-Z_0-9]
SJIS/EUC/UTF8: [a-zA-Z_0-9] + non ASCII

= Java
[a-zA-Z_0-9]
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html

= .NET
[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]

= Perl
e$B$?$V$se(B UTS #18 e$B$K=`$8$ke(B

http://www.unicode.org/reports/tr18/

= Python
e$B$?$V$se(B Perl e$B$HF1$8e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:40863] Re: revert 1.9 \w limitation to ASCII”
on Wed, 31 Mar 2010 02:39:18 +0900, “NARUSE, Yui”
[email protected] writes:

|e$B!VBg$-$JHs8_49@-$K$J$j$=$&$G$9!W$H$$$&$N$O2?$+6qBNE*$J%U%#!<%I%P%C%/$,e(B
|e$BGX7J$K$“$k$H;W$C$F$$$k$N$G$9$,!”$I$N$h$&$J%U%#!<%I%P%C%/$G$7$g$&$+!#e(B

e$BNc$K$h$C$F%=!<%9$r$O$C$-$j3P$($F$$$J$$$N$G62=L$G$9$,!“e(B1.9e$B$Ge(B
\we$B$,%^%C%A$7$J$/$J$C$?$H$$$&6l>p$r8+$?$3$H$,$”$j$^$9!#e(B
Twittere$B$@$C$?$+$J!#e(B

|e$B$^$:!"e(BEUC e$B$de(B SJIS e$B$KBP$7$F$N$b$N$@$H2>Dj$7$^$9!#e(B

|e$B$^$?!“e(BEUC e$B$He(B SJIS e$B7O$N$_$H$$$&$N$O0l4S@-$K7g$1$^$9!#e(B
|e$BMxJX@-$N$?$a$J$i0l4S@-$r7g$/$3$H$b$$$H$o$J$$$N$,e(B Ruby e$B$N;Q@*$G$O$”$j$^$9$,!“e(B
|e$BF|K\8l7O$@$1$H$$$&$N$O@5D>$$$+$,$J$b$N$+$H;W$$$^$9!#e(B
|e$B$H$$$&$o$1$G!”$3$NJ}8~$G9T$/$J$i$P!"e(Bnon ASCII non Unicode e$B$N>l9g$O!"e(B
|e$B$KJQ$($?J}$,$$$$$h$&$K46$8$^$9!#e(B

e$BK?M$O$=$N$D$b$j$G$7$?!#:#FI$_JV$9$H$=$&$OFI$a$^$;$s$M!#e(B

|e$B<!$K!“e(BUnicodee$B!”$H$$$&$+e(B UTF8 e$B$KBP$7$F$N$b$N$@$H2>Dj$7$^$9!#$3$3$G!“e(B
|> Unicodee$B$K$$$$F$O!“%-%c%i%/%?%G!<%?%Y!<e(B
|> e$B%9$,$”$k$N$G!"e(BUnicodee$BE
$K%-%c%i%/%?$J$b$N$rBP>]$K$9$k$N$,NI$$e(B
|> e$B$H;W$$$^$9!#e(B
|e$B$r:NMQ$9$k$H!”$9$0$K$O5$$E$-$E$i$$$,<B:]$KLdBj$,=P$k$H$$$&!"e(B
|e$BLq2p$J8_49@-LdBj$rAH$F~$l$k$3$H$K$J$j$^$9!#e(B
|
|e$B$H$$$&$N$b!"8e$KB>$N8@8l$G$Ne(B \w e$B$NCf?H$r=P$7$F$$$^$9$,!"IaDL$O$3$Ne(B
|e$B!Ve(BUnicodee$BE*$K%-%c%i%/%?$J$b$N!W$O5-9f$NN`$r4^$
$^$;$s!#e(B
|e$B$A$J$$K!"e(BBug #3047 e$B$O0lB-Aa$/$=$l$r4|BT$7$F$,$C$+$j$7$F$$$kNc$G$9!#e(B
|http://redmine.ruby-lang.org/issues/show/3047
|
|1.9 e$B$Ge(B \w e$B$r!Ve(BUnicodee$BE*$K%-%c%i%/%?$J$b$N!W$K$9$k$H$3$N5U!"e(B
|e$B6qBNE*$K$O:#$^$G%^%C%A$7$F$$$?0lIt$NJ8;z$,%^%C%A$7$J$/$J$j$^$9!#e(B
|e$B$3$l$Oe(B non ASCII e$B$,A4$F%^%C%A$7$J$/$J$ke(B (e$B$1$I$9$0$K5$$E$/e(B)
|e$B8=:
$N<BAu$h$j$?$A$,0-$$$N$G$O$J$$$G$7$g$&$+!#e(B
|e$B$D$^$j!"8_49@-$,M}M3$J$i$P$3$N0F$OL5$$$H;W$&$N$G$9!#e(B
|
|e$B$^$H$a$k$H!“8_49@-$,M}M3$J$i$P%(%s%3!<%G%#%s%0$K8B$i$:!“e(B
|(e$B$H$O8@$C$F$be(B non dummy encoding e$B$K$J$j$^$9$,e(B)
|[a-zA-Z_0-9] + non ASCII (= /[a-zA-Z_0-9\P{ASCII}]/) e$B$,@52r$G$7$g$&!#e(B
|Ruby e$B$NJ8K!E*$K$b$3$l$O<1JL;R$K;H$($kL>A0$H0lCW$9$k$N$G0UL#$,e(B
|e$B$J$-$K$7$b$”$i$:$G$”$k$h$&$K$O;W$$$^$9!#e(B

e$B3N$+$K$3$3$O5DO@$NM>CO$N$"$k$H$3$m$G$9!#e(B

e$B$^$:!"5sF0$N8uJd$re(B

(1) a-zA-Z_0-9
(2) a-zA-Z_0-9 + non ASCII
(3) Unicodee$BE*e(BCaharacter

e$B$H$7$^$9!#<!$K!"MxMQ<T$NN)>l$re(B

(a) 1.8e$B%9%/%j%W%H0?“<Te(B (EUC/SJIS)
(b) 1.8e$B%9%/%j%W%H0?”<Te(B (UTF-8)
(c) EUC/SJIS(e$BMW$9$k$Ke(BUnicodee$B0J30e(B)e$BMxMQ<Te(B
(d) Unicoder

e$B$HJ,$1$^$9!#$3$l$i$=$l$>$l$NN)>l$K$H$C$F!VK>$^$7$$!W5sF0$H$Oe(B

(a) e$B"*e(B (2) : e$B8_49@-$,0];}$5$l$k$+$ie(B
(b) e$B"*e(B (2) : e$B8_49@-$,0];}$5$l$k$+$ie(B
(c) e$B"*e(B (2) : e$B8_49@-$,0];}$5$l$k$+$ie(B
(d) e$B"e(B (3) : e$B$$=$i$/K\Mhe(B\we$B$K4|BT$9$k$H$3$m$@$+$ie(B

e$B$K$J$k$G$7$g$&!#e(B(d)e$B0J30$K$H$C$F$O!"@.@%$5$s$N$*$C$7$c$k$h$&e(B
e$B$K!"e(BUnicodee$B$b4^$a$Fe(B a-zA-Z_0-9 + non ASCII
e$B$K$9$Y$-$H$$$&7ke(B
e$BO@$K$J$j$=$&$G$9$M!#e(B

e$B$7$+$7!":#8e!"e(BRubye$B$NMxMQ<T$N$&$Ae(BUnicodere$B$N3d9g$OA}2C$7!“8_49e(B
e$B@-$r6/$/4|BT$9$k?M$O8:>/$9$k$G$”$m$&$3$H$r9M$($k$H!"e(B

non Unicode e$B"*e(B (2)
Unicode e$B"*e(B (3)

e$B$H$$$&$N$O!"$5$[$I0-$$A*Br$G$O$J$$$H;W$$$^$9!#0lJ}!"8=>u$Ne(B
a-zA-Z_0-9 e$B$K8BDj$9$k$3$H$O!"A40w$,!V$7$+$?$J$$!W$H46$8$k$b$Ne(B
e$B$N!"B?$/$,$&$l$7$/$J$$$H$$$&!VJ?Ey$KITK~!W$H$$$&$b$N$K$J$C$Fe(B
e$B$$$k$N$G$O$J$$$G$7$g$&$+!#e(B

e$B@.@%$5$s$,;XE&$5$l$ke(BUnicodee$B$K$*$1$k8_49@-LdBj$H$O!"e(B

  • Unicodee$BMxMQ<T!"$+$De(B
  • \w e$B$,A4$F$Ne(Bnon ASCIIe$B%-%c%i%/%?$K%^%C%A$9$k$3$H$r4|BT$9$ke(B

e$B?M$KH/@8$9$k$b$N$G$9$,!"$3$l$N?<9o$5$O$A$g$C$H$o$+$j$^$;$s!#e(B
e$B$?$$$7$?LdBj$G$O$J$5$=$&$J5$$b$9$k$s$@$1$I!#e(B

|e$B$J$*!"8_49@-$H$OJL$K=q$-$d$9$5$NLL$Ge(B \w [email protected];z$C$]$$$N$Ke(B
|e$B%^%C%A$7$FM_$7$$$H$$$&<gD%$J$i$PJL$N5DO@$G!"0J2<$N$h$&$J46$8$K$J$j$^$9$+!#e(B
|1. \w e$B$@$1FCJL07$$$7$?$$e(B
|2. \w e$B$@$1e(B Unicode e$B$O5$;}$A0-$$e(B
|2a. [:word:] e$B;H$C$F$he(B
|2b. \d e$B$He(B \s e$B$be(B Unicode e$B;V8~$KLa$=$&$<e(B

e$B$H$3$m$G!“e(B[:word:]e$B$C$F8=>u$J$K$K%^%C%A$7$^$9$+$M!#$J$s$H$J$/!“e(B
a-zA-Z_0-9e$B$K$7$+%^%C%A$7$J$$$h$&$J5$$,$9$k$s$G$9$,!#e(B[:word:]
e$B$,>e$G=R$Y$?5sF0$r$9$k$N$G$”$l$P!”;d$NDq93$O$@$$$V>/$J$/$J$ke(B
e$B$s$G$9$,!#e(B

                            e$B$^$D$b$He(B e$B$f$-$R$me(B /:|)

成瀬です。

2010å¹´3月31æ—¥7:09 Yukihiro M. [email protected]:

Twitterだったかな。
マッチしなくなること自体は予想されたものですが、
どのくらい深刻かというのは難しいところですね。
あと、そもそも期待されていたマッチ対象は何だったのか、とか。

|http://redmine.ruby-lang.org/issues/show/3047
|Ruby の文法的にもこれは識別子に使える名前と一致するので意味が
ã¨ã—ã¾ã™ã€‚æ¬¡ã«ã€åˆ©ç”¨è€…ã®ç«‹å ´ã‚’
 (c) → (2) : 互換性が維持されるから
 Unicode   → (3)

というのは、さほど悪い選択ではないと思います。一方、現状の
a-zA-Z_0-9 に限定することは、全員が「しかたない」と感じるもの
の、多くがうれしくないという「平等に不満」というものになって
いるのではないでしょうか。

¥d や ¥s、さらには String#upcase などの各種組み込みの挙動が
ASCII ベースの挙動なので、それとの一貫性はうれしいんじゃないでしょうか。

また、識別子としてよくある形式なので、まさにこれが欲しいという例も
それなりにあるでしょう。実際 Ruby の標準添付ライブラリには
それなりに ¥w を利用している例が存在します。

というか、わたしが ¥w を書くときに期待するのは基本的に ASCII の方で、
たまに $KCODE=‘u’ でもそうやってバグを作った方が多かったような。

成瀬さんが指摘されるUnicodeにおける互換性問題とは、

 * Unicode利用者、かつ
 * \w が全てのnon ASCIIキャラクタにマッチすることを期待する

人に発生するものですが、これの深刻さはちょっとわかりません。
たいした問題ではなさそうな気もするんだけど。

普通に実装すると、マッチしない例として、[¥〜、。]などなど。
深刻さはユースケースによると思うのですが、¥w のユースケースって
何なのでしょうか。考えた限りでは ¥S の方が適切だったり、数字を除いた方が
良さそうだったり、記号も含めるべきだったりで、いまいち使い道が。

ところで、個人的にマルチバイトの ¥w を使うときって [¥w¥W] で、
マルチバイトの . を作るときだけだったんですが、
普通の方って ¥w を何に使っているのでしょうか。

んですが。
Perl の ¥w と同じです。つまり、たぶんまつもとさんがイメージしているやつです。
マッチする: 0aA_0aAあ漢αЋ
マッチしない: -'@〜、。・¥
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/doc/re.rdoc?revision=HEAD&view=markup

以下は特に注のないものは全て Unicode 志向です

  • /[[:alnum:]]/ - Alphabetic and numeric character
  • /[[:alpha:]]/ - Alphabetic character
  • /[[:blank:]]/ - Space or tab
  • /[[:cntrl:]]/ - Control character
  • /[[:digit:]]/ - Digit
  • /[[:graph:]]/ - Non-blank character (excludes spaces, control
    characters, and similar)
  • /[[:lower:]]/ - Lowercase alphabetical character
  • /[[:print:]]/ - Like [:graph:], but includes the space
    character
  • /[[:punct:]]/ - Punctuation character
  • /[[:space:]]/ - Whitespace character ([:blank:],
    newline,
    carriage return, etc.)
  • /[[:upper:]]/ - Uppercase alphabetical
  • /[[:xdigit:]]/ - Digit allowed in a hexadecimal number (i.e.,
    0-9a-fA-F)
  • /[[:word:]]/ - A character in one of the following Unicode
    general categories Letter, Mark, Number,
    Connector_Punctuation<i/i>
  • /[[:ascii:]]/ - A character in the ASCII character set

で、これを眺めていると、人々が真に求めているのは実は [:graph:] なんじゃないか
と思ったりするわけです。