-
Notifications
You must be signed in to change notification settings - Fork 4
/
631.txt
257 lines (200 loc) · 9.35 KB
/
631.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
* 仕様書
[REFS[
-[5] [CITE@en-us[UTS #18: Unicode Regular Expressions]]
( ([TIME[2012-07-19 21:56:19 +09:00]] 版))
<http://www.unicode.org/reports/tr18/#Categories>
-- [12] [CITE@en-us[UTS #18: Unicode Regular Expressions]], [TIME[2022-02-08T14:02:12.000Z]], [TIME[2022-11-12T14:47:25.731Z]] <https://unicode.org/reports/tr18/#Script_Property>
]REFS]
* Unicode正規表現における特性
[13]
[[Unicode正規表現]]では、
[[UCD]] 等の[[特性][特性 (UCD)]]に基づく[[一致]]を表す機能が要求されています。
[SRC[>>12]]
[14]
その具体的な構文は[[正規表現]]の実装に委ねられていますが、
例えば
[CODE[\p{[[Script]]=Greek}]]
や
[CODE[__&&[&&__:[[Script]]=Greek:__&&]&&__]]
のように表されます。
[SRC[>>12]]
[24]
実例として次のような構文が示されています。
[SRC[>>12]]
各[[正規表現]]の実装は必ずしもこれに従う必要はありませんが、
大方これに近い形で実装しているようです。
- [25] [CODE[\p{]] [VAR[特性指定]] [CODE[}]] は、一致するものを表します。
- [26] [CODE[\P{]] [VAR[特性指定]] [CODE[}]] は、一致''しない''ものを表します。
- [27] [CODE[__&&[&&__:]] [VAR[特性指定]] [CODE[:__&&]&&__]] は、
一致するものを表します。 (旧構文)
- [28] [CODE[__&&[&&__:^]] [VAR[特性指定]] [CODE[:__&&]&&__]] は、
一致''しない''ものを表します。 (旧構文)
- [29] [VAR[特性指定]]は、[VAR[特性名]]か、
[VAR[特性名]]、[VAR[関係]]、[VAR[特性値]]です。
-- [30]
[VAR[特性名]]は、1個[[以上]]の[[ASCII英数字]],
[CODE[-]],
[CODE[_]],
[CODE(charname)@en[SP]]
の列です。
-- [31]
[VAR[関係]]は、
[CODE[=]],
[CODE[≠]],
[CODE[!=]]
のいずれかです。
-- [32]
[VAR[特性値]]は、
0個[[以上]]の[[リテラル]]
([[正規表現]]で特別な意味を持たない[[符号点]]または[[エスケープ]])
です。
** 特性データモデル
[15]
[[Unicode正規表現]]における[[特性]]は、
- [16] その[RUBYB[域][domain]] ([[定義域]]) が[[Unicode符号点]]のもの、
[[文字列]]のものがあります。
[SRC[>>12]]
- [17] その[RUBYB[余域][codomain]] ([[値域]]) が
[RUBYB[二値][Binary]],
[RUBYB[列挙][Enumerated]],
[RUBYB[数値][Numeric]],
[RUBYB[符号点][Code Point]],
[RUBYB[文字列][String]]、
それらの[RUBYB[集合][Set]]や[RUBYB[並び][List]]のものがあります。
[SRC[>>12]]
[18]
この値域の[[データ型]]は基本的には [[UCD]] の[[特性値]]のものに近いのですが、
少し違うので要注意です。
[19]
二値型は、列挙型の特殊形で、 [CODE[True]] と [CODE[False]] の2つの値があります。
[SRC[>>12]]
[[UCD]] の[[二値特性]]の[[特性値]]では他にも多くの[[別名]]があります。
[20]
列挙型は、 [[UCD]] の列挙型の他に、型録型にも対応 [SRC[>>12]] しています。
([[UCD]] では列挙型の値は固定的、型録型の値は将来追加される可能性がある、
という違いがあります。)
[21]
符号点型は、文字列型の特殊形で、常に1つの[[符号点]]となります。
[SRC[>>12]]
[22]
[[集合]]型は、一般に含むか含まないかの検査がなされます。
[SRC[>>12]]
[23]
[[並び]]型は、含むか含まないかの検査をすることもありますが、
順序が意味を持つ場合があることに要注意とされています。
[SRC[>>12]]
[50]
値の[[一致]]判定においては、一般に [[UAX #44]] の[[別名]]の一致の規則が適用されます。
(>>33, >>38)
[[特性]]によっては更に別の規定もあります。
[SEE[ [[General_Category]], [[文字の名前]] ]]
** 特性の名前と値
[33]
[[UCD]] の[[特性]]の名前と値は、
[[UCD]] のデータファイルに[[別名]]として示されたもので、
省略名と長い名前を使うことが推奨されています。
両方の名前を認識すること、
[[UAX #44]] の一致の規則に従うことが強く推奨されています。
[SRC[>>12]]
(>>38)
;; [34] [[別名]]は、省略名と長い名前の他にその他の[[別名]]が存在することもあります。
それらにも対応するべきなのかどうかは言及されていません。
区別なくすべての[[別名]]に対応するのが無難と思われます。
[35]
[VAR[特性指定]]において、
二値型の特性は名前だけを指定できます。
それ以外の特性は名前と値の両方が必要です。
[SRC[>>12]]
[47]
あまり明確には示されていませんが、名前だけが指定されると [CODE[=[[True]]]]
の省略が想定されるようです。また、二値型だからといって省略しなければならないということでもなさそうです。
[36]
例外的に、
[CODE[General_Category]]
と
[CODE[Script]]
は、
名前と[VAR[関係]]を省略して値だけを指定できます。
[SRC[>>12]]
[38]
[[UCD特性]]の[[特性]]や[[特性値]]の[[別名]]の[[一致]]については、 [[UAX #44]] の規定によります。
[SRC[>>12 RL1.2]]
;; [49]
二値型の時、値の[[別名]]も認められるべきなのかどうか明瞭ではありません。
[48]
ただし [CODE[is]] の無視については実装してなくても構いません。
[SRC[>>12 RL1.2]]
;; [43] 之は既存の実装が [CODE[is]] の有無を区別することが多いためです。
[SRC[>>12]]
[42]
[[UCD]] の[[別名]]以外に独自の[[別名]]を追加しても構いません。
[SRC[>>12]]
[40]
[[正規表現]]の実装が対応している従来の[[特性]]の名前との[[後方互換性]]のため、
[[Unicode正規表現]]本来の[[特性]]の名前のかわりに、
[CODE[Alphabetic]]
を
[CODE[Unicode_Alphabetic]]
とするなど、
名前を変更することが認められています。
[SRC[>>12]]
;; [41] これら多くのバリエーションが認められている上、
対応している[[Unicodeの版]]によっても結果が変わってきます。
同じように見える[[正規表現]]でも、
ある実装が対応しているかどうかだけではなく、
どのように対応しているかもチェックしないといけません。
[37]
[[Unicode正規表現]]の水準1では、数個の [[UCD特性]]への対応が要求されます。
[SRC[>>12 RL1.2]]
[39]
[[Unicode正規表現]]の水準1では、数個の互換性特性への対応が要求されます。
実装は Standard Recommendation と POSIX-compatible
のどちらによるかを明記しなければなりません。
[SRC[>>12 RL1.2a]]
[44]
[CODE[General_Category]] に属する特殊な名前として、
[CODE[Any]],
[CODE[Assigned]],
[CODE[ASCII]]
があります。
[SEE[ [[General_Category]] ]]
[45]
なお、実装は名前と値の組という概念を実装することも厳密には要求されていません。
同等の機能があれば足ります。
具体的には、
[CODE[\p{script=latin}]] の意味で [CODE[\p{script_latin}]]、
[CODE[\p{Block=Greek}]] の意味で [CODE[\p{Greek Block}]]
のようにも表現し得ることが例示されています。
;; [46] [[相互運用性]]の低下や[[プログラマー]]の混乱の元ですから、
あまり無闇矢鱈に一般的な構文から離れるのも如何かと思いますが。。。
* メモ
[1]
[[Perl]] 5.8.4には [CODE(perl)@en[\p{Compat}]]
がありましたが、 5.8.7 ではなくなっているみたいです。
([[名無しさん]] [WEAK[2006-01-29 13:18:12 +00:00]])
[2] [CITE@en[Unicode block names for use in XSD regular expressions]]
( ([TIME[2011-06-14 05:49:35 +09:00]] 版))
<http://www.w3.org/TR/2011/NOTE-xsd-unicode-blocknames-20110609/>
[3] [CITE@en-gb[perlunicode - perldoc.perl.org]]
( ([TIME[2012-11-23 23:18:45 +09:00]] 版))
<http://perldoc.perl.org/perlunicode.html#User-Defined-Character-Properties>
[4] >>3 Perl 5.8.8 では範囲を指定するときに [CODE(char)[[[U+0020]]]] 複数個でも良かったのですが、
Perl 5.10 以降では [CODE(char)[[[U+0009]]]] 1個でないといけないようです。
[6] [CITE[perldelta - search.cpan.org]]
( ([TIME[2014-05-30 01:08:05 +09:00]] 版))
<http://search.cpan.org/~rjbs/perl-5.20.0/pod/perldelta.pod#New_%5Cp%7BUnicode%7D_regular_expression_pattern_property>
[7] [CITE[perldelta - search.cpan.org]]
( ([TIME[2014-05-30 01:08:05 +09:00]] 版))
<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] [CITE[perlunicode - search.cpan.org]]
([TIME[2016-04-23 14:38:03 +09:00]] 版)
<http://search.cpan.org/dist/perl/pod/perlunicode.pod#Unicode_Character_Properties>
[9] [CITE@en-gb[perluniprops - perldoc.perl.org]]
([TIME[2015-06-15 22:59:25 +09:00]] 版)
<http://perldoc.perl.org/perluniprops.html>
[10] [CITE@en[Unicodeプロパティを使ったPerl正規表現 - Hatena Developer Blog]]
( ([TIME[2016-05-31 15:50:04 +09:00]]))
<http://developer.hatenastaff.com/entry/2016/05/31/123457>
[11] [CITE@en[Remove "Key Values and Unicode" section]]
([[garykac]]著, [TIME[2017-01-25 09:16:59 +09:00]])
<https://github.com/w3c/uievents/commit/8c621f6a46ba90996312ea12b96386eb51b92d42>