* 仕様書

[REFS[
- [1] [CITE@en-us[UTS #18: Unicode Regular Expressions]],
[TIME[2012-07-19 21:56:19 +09:00]]
<http://www.unicode.org/reports/tr18/>
-- [7] 
[CITE@en-us[UTS #18: Unicode Regular Expressions]], [TIME[2022-02-08T14:02:12.000Z]], [TIME[2022-11-13T03:33:01.774Z]] <https://unicode.org/reports/tr18/#Conformance>
-- [15] 
[CITE@en-us[UTS #18: Unicode Regular Expressions]], [TIME[2022-02-08T14:02:12.000Z]], [TIME[2022-11-13T04:14:29.697Z]] <https://unicode.org/reports/tr18/#Hex_Notation_and_Normalization>

]REFS]

[3] 
[DFN[[[UTS #18]]]]
は
[[Unicode]] の[[正規表現]]の[[仕様書]]です。

[4] 
[[正規表現]]には各[[言語]]等でいろいろな[[方言]]が ([[Unicode]] 以前から) あります。
[[Unicode正規表現]]は、それらについて [[Unicode]] 対応のための標準仕様を定めています。
しかし既存の[[方言]]の統一を企図したものではなく
[[Unicode]] 対応部分だけを[[規定]]としています。



* 構文

[FIG(short list)[ [2] [[UTS #18]] [[正規表現]]
- [[文字クラス]]
- [[十六進記法]]
- [CODE[\p]]
]FIG]

* 処理

[16] 
[[正規表現]]エンジンは、
[[正規表現]]の単独で一様な解釈のために、
入力テキストに常に [[NFC]] を適用しても構わない
[SRC[>>15]] とされています。

[17] しかしながら、 [[NFC]] は破壊的な操作で、
入力テキストを非可逆に変化させてしまいます。
[SEE[ [[Unicode正規化]] ]]
しかも、
[[正規表現]]一致部分を [[capture]] して利用するようなときに、
元の入力テキストと違った[[部分文字列]]もどきが出てきても困ることが多いのではないでしょうか。
[[利用者]] ([[正規表現]]を書く人) が明示的に要求しない限り、
実装が勝手に[[Unicode正規化]]を適用するべきとは思えません。

* 適合性

[8] 
[[実装]]は、
[[Unicodeの版]]、
[[UTS #18]] の版、
[RUBYB[[RUBY[水][すい]][RUBY[準][じゅん]]][Level]]の組に対して[[適合性]]を主張できます。
[SRC[>>7 C0]]

;; [9] [[Unicodeの版]]の改訂によって [[UCD]] が改訂されるので、
同じ[[正規表現]]でも [[Unicodeの版]]によって挙動が変わる可能性が高いです。

[10] 
現行 [[UTS #18]] には[DFN[[RUBYB[水準1][Level 1]]]] [SRC[>>7 C1]]
と[DFN[[RUBYB[水準2][Level 2]]]] [SRC[>>7 C1, C2]] があります。
過去の [[UTS #18]] には[DFN[[RUBYB[水準3][Level 3]]]] [SRC[>>7 C3]]
がありましたが、現在は廃止されています。

[11] 
部分実装も許されていますが、どの水準、どの機能に対応しているのか明確に記述することが求められています。
[SRC[>>7 C4]]

[12] 
一体となるシステムの他の構成部品と組み合わせて機能を実現すること 
(例えば他の機構により[[Unicode正規化]]された結果を入力として要求すること、
追加モジュールの利用を要求することなど)
も認められますが、その旨を明確に記述することが求められています。
[SRC[>>7]]

[13] 
[[後方互換性]]のために既定の状態では機能を有効にせず、何らかの設定によって有効にするような形態の実装も認められています。
[SRC[>>7]]

[EG[
[14] ただ[[正規表現]]を書いただけでは[[バイト列]]モードで動作し、
特定のオプションを与えると[[Unicode文字列]]モードに切り替わるような実装もあり得ます。

]EG]

* 実装

[5] 
現在広く使われている多くの[[プログラミング言語]]等が標準で [[Unicode正規表現]]に対応しています。
具体的にどの機能をどの程度実装しているかには違いがあります。
また、 [[Unicode正規表現]]にない独自の機能なども多々あります。
詳しくはそれぞれの項を参照。

* 関連

[6] [[EBNF]]

* メモ