\p

\p

仕様書

Unicode正規表現における特性

[13] Unicode正規表現では、 UCD 等の特性に基づく一致を表す機能が要求されています。 >>12

[14] その具体的な構文は正規表現の実装に委ねられていますが、 例えば \p{Script=Greek}[:Script=Greek:] のように表されます。 >>12

[24] 実例として次のような構文が示されています。 >>12正規表現の実装は必ずしもこれに従う必要はありませんが、 大方これに近い形で実装しているようです。

[69] Perl\p, \P に対応しています。 >>68 (UnicodePerl 構文を採用したようです。 >>12)

[73] Perl では \p{\P{ の後に ^ を指定すると意味を反転させられます。 >>68

[70] Perl特性指定が1文字だけのとき、 {, } を省略できるとしています。 >>68

[71] 具体的には General_Category の大分類だけを指定するときに、 \pL のように書けます。

特性データモデル

[15] Unicode正規表現における特性は、

  • [16] その (domain) (定義域) がUnicode符号点のもの、 文字列のものがあります。 >>12
  • [17] その余域 (codomain) (値域) が 二値 (Binary) , 列挙 (Enumerated) , 数値 (Numeric) , 符号点 (Code Point) , 文字列 (String) 、 それらの集合 (Set) 並び (List) のものがあります。 >>12

[98] 絵文字系の特性\p{Named_Sequence} などいくつかの特性は、符号点でなく文字列です。 つまり \p が1つの文字ではなく複数の文字列一致する可能性があります。

[18] この値域のデータ型は基本的には UCD特性値のものに近いのですが、 少し違うので要注意です。

[19] 二値型は、列挙型の特殊形で、 TrueFalse の2つの値があります。 >>12 UCD二値特性特性値では他にも多くの別名があります。

[20] 列挙型は、 UCD の列挙型の他に、型録型にも対応 >>12 しています。 (UCD では列挙型の値は固定的、型録型の値は将来追加される可能性がある、 という違いがあります。)

[21] 符号点型は、文字列型の特殊形で、常に1つの符号点となります。 >>12

[22] 集合型は、一般に含むか含まないかの検査がなされます。 >>12

[23] 並び型は、含むか含まないかの検査をすることもありますが、 順序が意味を持つ場合があることに要注意とされています。 >>12

[50] 値の一致判定においては、一般に UAX #44別名の一致の規則が適用されます。 (>>33, >>38) 特性によっては更に別の規定もあります。 General_Category, 文字の名前

特性の名前と値

[33] UCD特性の名前と値は、 UCD のデータファイルに別名として示されたもので、 省略名と長い名前を使うことが推奨されています。 両方の名前を認識すること、 UAX #44 の一致の規則に従うことが強く推奨されています。 >>12 (>>38)

[34] 別名は、省略名と長い名前の他にその他の別名が存在することもあります。 それらにも対応するべきなのかどうかは言及されていません。 区別なくすべての別名に対応するのが無難と思われます。

[35] 特性指定において、 二値型の特性は名前だけを指定できます。 それ以外の特性は名前と値の両方が必要です。 >>12

[47] あまり明確には示されていませんが、名前だけが指定されると =True の省略が想定されるようです。また、二値型だからといって省略しなければならないということでもなさそうです。

[36] 例外的に、 General_CategoryScript は、 名前と関係を省略して値だけを指定できます。 >>12

[80] Perl 5.26 から、 Script のかわりに Script_Extensions が値だけで指定できるように非互換変更されました。 Script_Extensions

[38] UCD特性特性特性値別名一致については、 UAX #44 の規定によります。 >>12 RL1.2

[49] 二値型の時、値の別名も認められるべきなのかどうか明瞭ではありません。 Perl はすべて認めているようです >>68

[48] ただし is の無視については実装してなくても構いません。 >>12 RL1.2

[43] 之は既存の実装が is の有無を区別することが多いためです。 >>12

[81] Perl は、 Perl 5.6 との後方互換性のため、 compound form でなくても書ける特性は先頭に Is Is_ があってもよいこととされています。 >>79

[82] Perl でいう compound form とは名前と値を指定する形式のことです。 ところが \p{IsScript:Arabic}\p{Arabic} と等しいとも例示されています。 >>79 compound form でなく書かれているなら、ではなく compound form でなくても書けるなら、と説明されているのは、 これが認められるということなのでしょうか。

[83] UCD の規定はこれを更に単純化したものになっています。 いっそその方が実装しやすそうです。

[85] Perl では、 Block も名前と関係を省略して値だけを指定できます。 更に、先頭に InIs を付けることができます。 ただし、 他と衝突するものは除外されています。 >>84

[86] これは Perl 独自のものです。 いくつかは現に衝突して使えません。 将来の Unicode 側の新規追加で更に使えないものが増える (プログラムを書く側から見れば非互換変更される) 可能性があり、 新しいコードでは避けるべきとされています >>84

[42] UCD別名以外に独自の別名を追加しても構いません。 >>12

[40] 正規表現の実装が対応している従来の特性の名前との後方互換性のため、 Unicode正規表現本来の特性の名前のかわりに、 AlphabeticUnicode_Alphabetic とするなど、 名前を変更することが認められています。 >>12, >>61

[41] これら多くのバリエーションが認められている上、 対応しているUnicodeの版によっても結果が変わってきます。 同じように見える正規表現でも、 ある実装が対応しているかどうかだけではなく、 どのように対応しているかもチェックしないといけません。

[37] Unicode正規表現の水準1では、数個の UCD特性への対応が要求されます。 >>12 RL1.2

[62] Unicode正規表現の水準2では、加えて多数の UCD特性や関連規格の特性への対応が要求されます。 >>61 RL2.7

[39] Unicode正規表現の水準1では、数個の互換性特性への対応が要求されます。 >>12 RL1.2a, >>67 実装は Standard Recommendation と POSIX-compatible のどちらによるかを明記しなければなりません。 >>12 RL1.2a

[44] General_Category に属する特殊な名前として、 Any, Assigned, ASCII があります。 General_Category

[64] その他いくつかの UCD特性や関連規格の特性へも対応して構わないとされます。 >>63

[66] 同じ構文で Unicode 以外の特性を実装することも特に禁止されていないようです。 ただし将来の Unicode の拡張と衝突するリスクは伴います。

[88] PerlUnicode にない独自のものを多数提供しています >>87

[1] Perl 5.8.4には \p{Compat} がありましたが、 5.8.7 ではなくなっているみたいです。 (名無しさん 2006-01-29 13:18:12 +00:00)

[93] Perl では利用者 (プログラムの開発者) が二値特性を定義できます。 IsIn で始まる名前を使いますが、 パッケージ名で修飾できるので Foo::InBar のような形になることもあります。 組み込みの名前と衝突する場合は、独自定義のものが優先されます。 >>3


[55] 関係は明確に定められていませんが、 = であれば指定された特性値一致すること、 != であれば指定された特性値一致しないことが求められるようです。

[72] Perl では = のかわりに : も使えます。 >>68


[56] 特性値は水準1では値そのものの指定だけですが、 水準2ではワイルドカードに対応しなければなりません。 >>51 RL2.6

[57] ワイルドカードとしては、 特性値の条件を記述する正規表現を与えるか、 特性値と一致するべき特性の名前を与えることができます。 >>51

[90] Perl では正規表現として記述できるものは、通常の Perl正規表現よりかなり制限されています。 >>89

[58] 特性値正規表現によって判断する場合、 大文字と小文字の区別等の無視 (>>38) はなされません。 >>51

[91] Perl では大文字と小文字の区別が行われません (/i 相当)。 正規表現内で (?-i) を明示的に指定すれば区別されるようになります。 ただし \p{name} では区別されます。 >>89

[92] Perl では一部の特性正規表現一致を指定できません。 >>89

[59] 特性値特性との一致によって判断する場合、 特性の名前として identitiy を指定できます。 この値は、その対象そのものを表します。 >>51

[60] \p{toLowercase≠@identity@} は、 小文字が元の符号点と等しくないことを意味します。 >>51

[65] identity\p{identity=x のように実装することも認められています >>63

[45] なお、実装は名前と値の組という概念を実装することも厳密には要求されていません。 同等の機能があれば足ります。 具体的には、 \p{script=latin} の意味で \p{script_latin}\p{Block=Greek} の意味で \p{Greek Block} のようにも表現し得ることが例示されています。

[46] 相互運用性の低下やプログラマーの混乱の元ですから、 あまり無闇矢鱈に一般的な構文から離れるのも如何かと思いますが。。。

大文字と小文字

[74] \p による特性の一致判定のほとんどは、 大文字と小文字の区別をしないオプション (/i) と無関係に動作します。 >>68

[75] ところが Perl では次のものが /i によって挙動が変化します。 >>68

[97] UTS #18 はこの問題について何も言及していません。

非Unicode文字

[95] PerlUnicode符号点でないもの (U-00110000 以上) に対して \p を検査する時、 (何の変哲もない) 未割当符号点とみなします。 >>94

メモ

[4] >>3 Perl 5.8.8 では範囲を指定するときに U+0020 複数個でも良かったのですが、 Perl 5.10 以降では U+0009 1個でないといけないようです。

[6] perldelta - search.cpan.org ( ( 版)) http://search.cpan.org/~rjbs/perl-5.20.0/pod/perldelta.pod#New_%5Cp%7BUnicode%7D_regular_expression_pattern_property

[7] perldelta - search.cpan.org ( ( 版)) http://search.cpan.org/~rjbs/perl-5.20.0/pod/perldelta.pod#%5Cp%7B%7D%2C_%5CP%7B%7D_matching_has_changed_for_non-Unicode_code_points.

[8] perlunicode - search.cpan.org ( 版) http://search.cpan.org/dist/perl/pod/perlunicode.pod#Unicode_Character_Properties

[9] perluniprops - perldoc.perl.org ( 版) http://perldoc.perl.org/perluniprops.html

[10] Unicodeプロパティを使ったPerl正規表現 - Hatena Developer Blog ( ()) http://developer.hatenastaff.com/entry/2016/05/31/123457

[11] Remove "Key Values and Unicode" section (garykac著, ) https://github.com/w3c/uievents/commit/8c621f6a46ba90996312ea12b96386eb51b92d42

[101] GitHub - tc39/proposal-regexp-unicode-sequence-properties: Proposal to add support for sequence properties in Unicode property escapes to ECMAScript regular expressions., https://github.com/tc39/proposal-regexp-unicode-sequence-properties