<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><section><h1>仕様書</h1><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="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <cite xml:lang="en-us">UTS #18: Unicode Regular Expressions</cite>,
<time>2012-07-19 21:56:19 +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.unicode.org/reports/tr18/">http://www.unicode.org/reports/tr18/</anchor-external><ul><li><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> 
<cite xml:lang="en-us">UTS #18: Unicode Regular Expressions</cite>, <time>2022-02-08T14:02:12.000Z</time>, <time>2022-11-13T03:33:01.774Z</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/#Conformance">https://unicode.org/reports/tr18/#Conformance</anchor-external></li><li><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> 
<cite xml:lang="en-us">UTS #18: Unicode Regular Expressions</cite>, <time>2022-02-08T14:02:12.000Z</time>, <time>2022-11-13T04:14:29.697Z</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/#Hex_Notation_and_Normalization">https://unicode.org/reports/tr18/#Hex_Notation_and_Normalization</anchor-external></li></ul></li></ul></refs><p><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> 
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTS #18</anchor></dfn>
は
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</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="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>には各<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:">Unicode</anchor> 以前から) あります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規表現</anchor>は、それらについて <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> 対応のための標準仕様を定めています。
しかし既存の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">方言</anchor>の統一を企図したものではなく
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> 対応部分だけを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">規定</anchor>としています。</p></section><section><h1>構文</h1><figure class="short list"><figcaption><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 xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTS #18</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor></figcaption><ul><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">十六進記法</anchor></li><li><code>\p</code></li></ul></figure></section><section><h1>処理</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> 
<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:">NFC</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="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;15</anchor-internal></src> とされています。</p><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> しかしながら、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NFC</anchor> は破壊的な操作で、
入力テキストを非可逆に変化させてしまいます。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>Unicode正規化</anchor> </sw-see>
しかも、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>一致部分を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">capture</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> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>を書く人) が明示的に要求しない限り、
実装が勝手に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規化</anchor>を適用するべきとは思えません。</p></section><section><h1>適合性</h1><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:">実装</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicodeの版</anchor>、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTS #18</anchor> の版、
<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">Level</rt></rubyb>の組に対して<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="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal> C0</src></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><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:">Unicodeの版</anchor>の改訂によって <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UCD</anchor> が改訂されるので、
同じ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>でも <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicodeの版</anchor>によって挙動が変わる可能性が高いです。</comment-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:">UTS #18</anchor> には<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">水準1<rt xmlns="http://www.w3.org/1999/xhtml">Level 1</rt></rubyb></dfn> <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="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal> C1</src>
と<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">水準2<rt xmlns="http://www.w3.org/1999/xhtml">Level 2</rt></rubyb></dfn> <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="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal> C1, C2</src> があります。
過去の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTS #18</anchor> には<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">水準3<rt xmlns="http://www.w3.org/1999/xhtml">Level 3</rt></rubyb></dfn> <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="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal> C3</src>
がありましたが、現在は廃止されています。</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> 
部分実装も許されていますが、どの水準、どの機能に対応しているのか明確に記述することが求められています。
<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="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal> C4</src></p><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:">Unicode正規化</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="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal></src></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:">後方互換性</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="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal></src></p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><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> ただ<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:">Unicode文字列</anchor>モードに切り替わるような実装もあり得ます。</p></example></section><section><h1>実装</h1><p><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> 
現在広く使われている多くの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>等が標準で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規表現</anchor>に対応しています。
具体的にどの機能をどの程度実装しているかには違いがあります。
また、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規表現</anchor>にない独自の機能なども多々あります。
詳しくはそれぞれの項を参照。</p></section><section><h1>関連</h1><p><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 xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EBNF</anchor></p></section><section><h1>メモ</h1></section></body></html>