[13] Unicode正規表現では、 UCD 等の特性に基づく一致を表す機能が要求されています。 >>12
[14]
その具体的な構文は正規表現の実装に委ねられていますが、
例えば
\p{Script=Greek}
や
[:Script=Greek:]
のように表されます。
>>12
[24] 実例として次のような構文が示されています。 >>12 各正規表現の実装は必ずしもこれに従う必要はありませんが、 大方これに近い形で実装しているようです。
\p{
特性指定 }
は、一致するものを表します。
>>12\P{
特性指定 }
は、一致しないものを表します。
>>12[:
特性指定 :]
は、
一致するものを表します。 (旧構文)
>>12[:^
特性指定 :]
は、
一致しないものを表します。 (旧構文)
>>12\p
を域が符号点のものに限定したいときに、
\m
をかわりに符号点にも文字列にも適用可能なものとして使えます。
>>99[69]
Perl は \p
, \P
に対応しています。
>>68
(Unicode は Perl 構文を採用したようです。 >>12)
[73]
Perl では \p{
や \P{
の後に ^
を指定すると意味を反転させられます。 >>68
[70]
Perl は特性指定が1文字だけのとき、
{
, }
を省略できるとしています。 >>68
[71]
具体的には General_Category
の大分類だけを指定するときに、
\pL
のように書けます。
[15] Unicode正規表現における特性は、
[98]
絵文字系の特性や
\p{Named_Sequence}
などいくつかの特性は、域が符号点でなく文字列です。
つまり \p
が1つの文字ではなく複数の文字列に一致する可能性があります。
[18] この値域のデータ型は基本的には UCD の特性値のものに近いのですが、 少し違うので要注意です。
[19]
二値型は、列挙型の特殊形で、 True
と False
の2つの値があります。
>>12
UCD の二値特性の特性値では他にも多くの別名があります。
[20] 列挙型は、 UCD の列挙型の他に、型録型にも対応 >>12 しています。 (UCD では列挙型の値は固定的、型録型の値は将来追加される可能性がある、 という違いがあります。)
[21] 符号点型は、文字列型の特殊形で、常に1つの符号点となります。 >>12
[22] 集合型は、一般に含むか含まないかの検査がなされます。 >>12
[23] 並び型は、含むか含まないかの検査をすることもありますが、 順序が意味を持つ場合があることに要注意とされています。 >>12
[50]
値の一致判定においては、一般に UAX #44 の別名の一致の規則が適用されます。
(>>33, >>38)
特性によっては更に別の規定もあります。
[33] UCD の特性の名前と値は、 UCD のデータファイルに別名として示されたもので、 省略名と長い名前を使うことが推奨されています。 両方の名前を認識すること、 UAX #44 の一致の規則に従うことが強く推奨されています。 >>12 (>>38)
[35] 特性指定において、 二値型の特性は名前だけを指定できます。 それ以外の特性は名前と値の両方が必要です。 >>12
[47]
あまり明確には示されていませんが、名前だけが指定されると =True
の省略が想定されるようです。また、二値型だからといって省略しなければならないということでもなさそうです。
[36]
例外的に、
General_Category
と
Script
は、
名前と関係を省略して値だけを指定できます。
>>12
[80]
Perl 5.26 から、
Script
のかわりに Script_Extensions
が値だけで指定できるように非互換変更されました。
[38] UCD特性の特性や特性値の別名の一致については、 UAX #44 の規定によります。 >>12 RL1.2
[48]
ただし is
の無視については実装してなくても構いません。
>>12 RL1.2
[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
も名前と関係を省略して値だけを指定できます。
更に、先頭に
In
や Is
を付けることができます。
ただし、
他と衝突するものは除外されています。
>>84
[96]
XML Schema の正規表現では Is
+ ブロック名の二値型の特性が提案されていました。
>>2
[2] Unicode block names for use in XSD regular expressions ( ( 版)) http://www.w3.org/TR/2011/NOTE-xsd-unicode-blocknames-20110609/
[42] UCD の別名以外に独自の別名を追加しても構いません。 >>12
[40]
正規表現の実装が対応している従来の特性の名前との後方互換性のため、
Unicode正規表現本来の特性の名前のかわりに、
Alphabetic
を
Unicode_Alphabetic
とするなど、
名前を変更することが認められています。
>>12, >>61
[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
があります。
[64] その他いくつかの UCD特性や関連規格の特性へも対応して構わないとされます。 >>63
[66] 同じ構文で Unicode 以外の特性を実装することも特に禁止されていないようです。 ただし将来の Unicode の拡張と衝突するリスクは伴います。
[88] Perl は Unicode にない独自のものを多数提供しています >>87。
[1]
Perl 5.8.4には \p{Compat}
がありましたが、 5.8.7 ではなくなっているみたいです。
(名無しさん 2006-01-29 13:18:12 +00:00)
[93]
Perl では利用者 (プログラムの開発者) が二値特性を定義できます。
Is
や In
で始まる名前を使いますが、
パッケージ名で修飾できるので
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
[45]
なお、実装は名前と値の組という概念を実装することも厳密には要求されていません。
同等の機能があれば足ります。
具体的には、
\p{script=latin}
の意味で \p{script_latin}
、
\p{Block=Greek}
の意味で \p{Greek Block}
のようにも表現し得ることが例示されています。
[74]
\p
による特性の一致判定のほとんどは、
大文字と小文字の区別をしないオプション (/i
)
と無関係に動作します。
>>68
[95]
Perl はUnicode符号点でないもの (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