<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>における<dfn>文字クラス</dfn>は、
複数種の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>のいずれかに<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一致</anchor>すればよいことを表します。</p><p><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> 正規表現に限らない文字クラスについては<anchor>文字の集合</anchor> </sw-see></p><section><h1>POSIX 式文字クラス [: ... :]</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <cite xml:lang="ja">Lesson1 Step2 検索条件を設定しよう ~簡易表現と正規表現~ - 超漢字ウェブサイト</cite> (<time>2008-07-09 11:32:56 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.chokanji.com/knowhow/vol01_02.html">http://www.chokanji.com/knowhow/vol01_02.html</anchor-external></p><blockquote><p>日本基本、日本補助、GT、大漢和、中国、韓国、台湾、各国、JIS第1第2、JIS第3、JIS第4が使用できます。</p></blockquote><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> <cite>Character Classes</cite>, <time>2005-08-24T23:33:46.000Z</time>, <time>2025-08-27T08:53:01.108Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://syllabary.sourceforge.net/Articles/PatternMatching/EthiopicClasses.html">https://syllabary.sourceforge.net/Articles/PatternMatching/EthiopicClasses.html</anchor-external></p><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エチオピア文字</anchor>用<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor></p></section><section><h1>文字クラスの文字クラス</h1><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>なんかの文字クラス、こんなのは悪い例でしょう。 <samp class="regex"> [ぁ-ん] </samp><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1</anchor-internal> のような例は、特定の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字の配列に依存してます。使う文字コードが決まってるならいいじゃないかと思うかもしれませんが、文字コードでの配列順を知らないと何を表しているのかがはっきりしないのはいただけません。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> 同様に <samp class="regex"> [!-~] </samp> も悪い例です。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII</anchor> に含まれている <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SP</anchor> 以外の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">印字可能文字</anchor>の集合を表したいのなら面倒でも94文字列挙するべきですし、範囲 <code>0x21</code>〜<code>0x7E</code> を示したいなら <code class="regex"> [\x21-\x7E] </code> のような書き方 (が出来るなら。) をした方が意味がはっきりします。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> 但し、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">用字系</anchor>で確立した文字配列順があるなら、それを使うのもいいかとは思います。例えば <samp class="regex"> [A-Z] </samp> や <samp class="regex"> [あ-ん] </samp> は十分論理的です。 (但し、実際には前者は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EBCDIC</anchor> の場合に、後者は<em>ほとんど全て</em>の場合に、意図したようには動きません。<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><samp xmlns="http://www.w3.org/1999/xhtml" class="char">A</samp>〜<samp xmlns="http://www.w3.org/1999/xhtml" class="char">Z</samp> の間の並びにそれ以外の文字が混じっているからです。</weak>)<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> そのような場合には、処理系によっては <samp class="regex"><strong>[</strong>[:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">digit</anchor>:]<strong>]</strong></samp> とか <samp class="regex"> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">\p</anchor>{InHiragana} </samp> のような書き方が出来るかもしれません。これなら、可搬性・可読性の高い正規表現がかけます。<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;5</anchor-internal> しかし問題もあって、処理系によって書き方が違うこと、同じ名前でも実際の中身は異なる可能性があること、意図した集合が用意されているとは限らない <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(用字系に付属する記号類 (<anchor>句読点</anchor>や<anchor>字上符</anchor>など) の扱いとか。)</weak> ことなど、本当に使い物になるかは未知数です。 <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(それを言ったら <code xmlns="http://www.w3.org/1999/xhtml" class="regex"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">\s</anchor></code> とかも同じことなんですが。)</weak></li></ul></li></ul></li></ul></section><section><h1>空の文字クラス</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> では、 [] や [^] のような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>はエラーになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ES3</anchor> では、空の文字クラスが認められています。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Firefox</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Safari</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Chrome</anchor> もそれに従っているようです。
[] は何にも一致しません。 [^] はどんな文字にも一致します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Opera</anchor> 9.61 ではなぜか逆になっています。 [^] は何にも一致しません。
[] はどんな文字にも一致します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WinIE 7</anchor> ではエラーになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> []x]</p><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ES3</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Firefox</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Opera</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Safari</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Chrome</anchor> では空の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor> + x + ]
と解釈されるらしく、何も一致しません。</p><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WinIE 7</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> では ] と x が含まれる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>として解釈されるようです。</p><p><anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="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">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</anchor-external></p></section><section><h1>文字クラス中のエスケープ</h1><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エスケープ</anchor>の項を参照。</p></section><section><h1>文字クラス中の範囲と文字クラスを表すエスケープ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ES3</anchor> (15.10.2.15 の定義や 15.10.2.16 の non-normative note) によれば、
[\w-\d] のように範囲の一方または両方が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>を表す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エスケープ</anchor>の場合、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SyntaxError</anchor> になるはずです。ですが、実際にはどのブラウザでも
\w、文字 -、 \d のようにばらばらに処理されます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> ちなみに <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> でもブラウザと同じみたいです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> 
[\s--?] のような範囲は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ES3</anchor> 的には構文エラーになるはずですが、
ブラウザではどれも、 \s と - から ? までになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> でもブラウザと同じみたいです。</p><p><anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="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">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</anchor-external></p></section><section><h1>Unicode 文字クラス</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規表現</anchor>には<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ruby xmlns="http://www.w3.org/1999/xhtml">文<rt>も</rt></ruby><ruby xmlns="http://www.w3.org/1999/xhtml">字<rt>じ</rt></ruby>クラス<rt xmlns="http://www.w3.org/1999/xhtml">Character Class</rt></rubyb></dfn>があります。
構文と意味が定められています。
ただし<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">規定</anchor>ではなく、既存の構文に合わせたものとして良いとされています。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;21</anchor-internal></src></p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> <cite xml:lang="en-us">UTS #18: Unicode Regular Expressions</cite>, <time>2022-02-08T14:02:12.000Z</time>, <time>2022-11-13T03:17:30.759Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://unicode.org/reports/tr18/#character_ranges">https://unicode.org/reports/tr18/#character_ranges</anchor-external></li></ul></refs></section><section><h1><code>\p</code></h1><p><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <code xmlns="http://www.w3.org/1999/xhtml">\p</code> </sw-see></p></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> <cite>Perlの正規表現のバグ? (前編) - muddy brown thang</cite>
( (<time>2011-02-20 23:38:57 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://d.hatena.ne.jp/moriyoshi/20090315/1237103809">http://d.hatena.ne.jp/moriyoshi/20090315/1237103809</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> <cite>perlre - search.cpan.org</cite>
(<time>2016-04-23 01:02:26 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://search.cpan.org/dist/perl/pod/perlre.pod#Character_Classes_and_other_Special_Escapes">http://search.cpan.org/dist/perl/pod/perlre.pod#Character_Classes_and_other_Special_Escapes</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> <cite>perlrecharclass - search.cpan.org</cite>
(<time>2016-04-23 01:04:50 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://search.cpan.org/dist/perl/pod/perlrecharclass.pod">http://search.cpan.org/dist/perl/pod/perlrecharclass.pod</anchor-external></p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> <cite>文字セット定義の記法 v1.0 - CharacterSetNotation_V10_20180323.pdf</cite>, <time>2022-09-27T21:23:34.000Z</time>, <time>2022-12-02T05:14:37.048Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://imi.go.jp/contents/2018/07/CharacterSetNotation_V10_20180323.pdf">https://imi.go.jp/contents/2018/07/CharacterSetNotation_V10_20180323.pdf</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> <cite>使用文字規制の記法 v1.0 - CharacterSetRegulationNotation_V10_20180323.pdf</cite>, <time>2022-09-27T21:23:35.000Z</time>, <time>2022-12-02T05:13:52.422Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://imi.go.jp/contents/2018/07/CharacterSetRegulationNotation_V10_20180323.pdf">https://imi.go.jp/contents/2018/07/CharacterSetRegulationNotation_V10_20180323.pdf</anchor-external></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <cite xml:lang="en">GitHub - tc39/proposal-regexp-v-flag: UTS18 set notation in regular expressions</cite>, <time>2023-04-28T10:00:28.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/tc39/proposal-regexp-v-flag">https://github.com/tc39/proposal-regexp-v-flag</anchor-external></p></section></body></html>