/
703.txt
70 lines (45 loc) · 4.97 KB
/
703.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
* POSIX 式文字クラス [: ... :]
[16] [CITE@ja[Lesson1 Step2 検索条件を設定しよう ~簡易表現と正規表現~ - 超漢字ウェブサイト]] ([TIME[2008-07-09 11:32:56 +09:00]] 版) <http://www.chokanji.com/knowhow/vol01_02.html>
>日本基本、日本補助、GT、大漢和、中国、韓国、台湾、各国、JIS第1第2、JIS第3、JIS第4が使用できます。
* 文字クラスの文字クラス
- [1] [[正規表現]]なんかの文字クラス、こんなのは悪い例でしょう。 [SAMP(regex)[ [ぁ-ん] ]]
-- [2] >>1 のような例は、特定の[[文字コード]]の文字の配列に依存してます。使う文字コードが決まってるならいいじゃないかと思うかもしれませんが、文字コードでの配列順を知らないと何を表しているのかがはっきりしないのはいただけません。
-- [3] 同様に [SAMP(regex)[ [!-~] ]] も悪い例です。 [[ASCII]] に含まれている [[SP]] 以外の[[印字可能文字]]の集合を表したいのなら面倒でも94文字列挙するべきですし、範囲 [CODE[0x21]]〜[CODE[0x7E]] を示したいなら [CODE(regex)[ [\x21-\x7E] ]] のような書き方 (が出来るなら。) をした方が意味がはっきりします。
- [4] 但し、[[用字系]]で確立した文字配列順があるなら、それを使うのもいいかとは思います。例えば [SAMP(regex)[ [A-Z] ]] や [SAMP(regex)[ [あ-ん] ]] は十分論理的です。 (但し、実際には前者は [[EBCDIC]] の場合に、後者は''ほとんど全て''の場合に、意図したようには動きません。[WEAK[[SAMP(char)[A]]〜[SAMP(char)[Z]] の間の並びにそれ以外の文字が混じっているからです。]])
-- [5] そのような場合には、処理系によっては [SAMP(regex)['''['''[:[[digit]]:]''']''']] とか [SAMP(regex)[ [[\p]]{InHiragana} ]] のような書き方が出来るかもしれません。これなら、可搬性・可読性の高い正規表現がかけます。
--- [6] >>5 しかし問題もあって、処理系によって書き方が違うこと、同じ名前でも実際の中身は異なる可能性があること、意図した集合が用意されているとは限らない [WEAK[(用字系に付属する記号類 ([[句読点]]や[[字上符]]など) の扱いとか。)]] ことなど、本当に使い物になるかは未知数です。 [WEAK[(それを言ったら [CODE(regex)[[[\s]]]] とかも同じことなんですが。)]]
* 空の文字クラス
[7] [[Perl]] では、 [] や [^] のような[[空]]の[[文字クラス]]はエラーになります。
[8] [[ES3]] では、空の文字クラスが認められています。
[[Firefox]]、[[Safari]]、[[Chrome]] もそれに従っているようです。
[] は何にも一致しません。 [^] はどんな文字にも一致します。
[9] [[Opera]] 9.61 ではなぜか逆になっています。 [^] は何にも一致しません。
[] はどんな文字にも一致します。
[10] [[WinIE 7]] ではエラーになります。
[11] []x]
[[ES3]], [[Firefox]], [[Opera]], [[Safari]], [[Chrome]] では空の[[文字クラス]] + x + ]
と解釈されるらしく、何も一致しません。
[[WinIE 7]] と [[Perl]] では ] と x が含まれる[[文字クラス]]として解釈されるようです。
<http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0D%0Adocument.write%20(%22%5D%22.match(%2F%5E%5B%5Dx%5D%24%2F)%3F1%3A0)%3B%0D%0A%3C%2Fscript%3E>
* 文字クラス中のエスケープ
[[エスケープ]]の項を参照。
* 文字クラス中の範囲と文字クラスを表すエスケープ
[12] [[ES3]] (15.10.2.15 の定義や 15.10.2.16 の non-normative note) によれば、
[\w-\d] のように範囲の一方または両方が[[文字クラス]]を表す[[エスケープ]]の場合、
[[SyntaxError]] になるはずです。ですが、実際にはどのブラウザでも
\w、文字 -、 \d のようにばらばらに処理されます。
[13] ちなみに [[Perl]] でもブラウザと同じみたいです。
[14]
[\s--?] のような範囲は [[ES3]] 的には構文エラーになるはずですが、
ブラウザではどれも、 \s と - から ? までになります。
[15] [[Perl]] でもブラウザと同じみたいです。
<http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0Adocument.write%20(%224%22.match(%2F%5E%5B%5Cw--%3F%5D%24%2F)%3F1%3A0)%3B%0A%3C%2Fscript%3E>
[17] [CITE[Perlの正規表現のバグ? (前編) - muddy brown thang]]
( ([TIME[2011-02-20 23:38:57 +09:00]] 版))
<http://d.hatena.ne.jp/moriyoshi/20090315/1237103809>
[18] [CITE[perlre - search.cpan.org]]
([TIME[2016-04-23 01:02:26 +09:00]] 版)
<http://search.cpan.org/dist/perl/pod/perlre.pod#Character_Classes_and_other_Special_Escapes>
[19] [CITE[perlrecharclass - search.cpan.org]]
([TIME[2016-04-23 01:04:50 +09:00]] 版)
<http://search.cpan.org/dist/perl/pod/perlrecharclass.pod>