Shiro(2019/09/20 12:58:46 UTC): 曖昧に運用してきたんだけどissueが立った (#496, #525) ので真面目に考える。
\d
, \s
, \w
[:alpha:]
等のPOSIX文字クラス
char-set:letter
等
これらは、Unicode範囲までカバーすべきか、ASCII範囲に止めるか。
中途半端だった
\d
, \s
, \w
はASCII範囲のみ
[:digit:]
, [:space:]
, [:blank:]
はASCII範囲のみ、それ以外のPOSIX文字クラスはUnicode全域
char-set:digit
, char-set:whitespace
, char-set:blank
はASCII範囲のみ、それ以外のpredefined charsetはUnicode全域
digit, whitespaceが特別扱いなのは、\d
, \s
がそれらを利用してるため。
で、例えば入力値のバリデーション等にASCII範囲の数字、スペース、文字を想定して\d
、
\s
、\w
を使っているコードが大量にあるので、
これらを変えると予想外のコードを壊す怖れがある。
\d
、\s
、\w
これらは変更の影響が大きいので、ASCII範囲に限定する
一貫してることが望ましい。
PCREやOnigurumaを見ると、フラグで切り替えられるようになっている。デフォルトはASCIIのようだ。
regexp literalはオプションを与えることが出来る (e.g. #/.../u
でUnicode全域、とか)が、charset literalの方はやりにくい。
また、リテラルはリード時の問題なので、パラメータでも切り替えにくいし、
そういう暗黙な切り替えデータとしてそれらのリテラルを含むファイルを読み込む際に
振る舞いが予想外になったりするので好ましくない。
そこで、[:alpha:]
などはASCII範囲とし、
Unicode全域を含める場合は[:ALPHA:]
と大文字にすることにした。
こちらは原則Unicode全域とし、ASCII範囲に限定したものとして
char-set:ascii-letter
など ascii-
をつけたものを用意した。