forked from kkos/oniguruma
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RE.ja
533 lines (372 loc) · 19 KB
/
RE.ja
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
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
鬼車 正規表現 Version 6.7.0 2017/12/08
使用文法: ONIG_SYNTAX_ONIGURUMA (既定値)
1. 基本要素
\ 退避修飾 (エスケープ) 正規表現記号の有効/無効の制御
| 選択子
(...) 式集合 (グループ)
[...] 文字集合 (文字クラス)
2. 文字
\t 水平タブ (0x09)
\v 垂直タブ (0x0B)
\n 改行 (0x0A)
\r 復帰 (0x0D)
\b 後退空白 (0x08)
\f 改頁 (0x0C)
\a 鐘 (0x07)
\e 退避修飾 (0x1B)
\nnn 八進数表現 符号化バイト値(の一部)
\o{17777777777} 拡張八進数表現 コードポイント値
\uHHHH 拡張十六進数表現 コードポイント値
\xHH 十六進数表現 符号化バイト値(の一部)
\x{7HHHHHHH} 拡張十六進数表現 コードポイント値
\cx 制御文字表現 コードポイント値
\C-x 制御文字表現 コードポイント値
\M-x 超 (x|0x80) コードポイント値
\M-\C-x 超 + 制御文字表現 コードポイント値
※ \bは、文字集合内でのみ有効
3. 文字種
. 任意文字 (改行を除く: オプションに依存)
\w 単語構成文字
Unicode以外の場合:
英数字, "_" および 多バイト文字。
Unicodeの場合:
General_Category -- (Letter|Mark|Number|Connector_Punctuation)
\W 非単語構成文字
\s 空白文字
Unicode以外の場合:
\t, \n, \v, \f, \r, \x20
Unicodeの場合:
U+0009, U+000A, U+000B, U+000C, U+000D, U+0085(NEL),
General_Category -- Line_Separator
-- Paragraph_Separator
-- Space_Separator
\S 非空白文字
\d 10進数字
Unicodeの場合: General_Category -- Decimal_Number
\D 非10進数字
\h 16進数字 [0-9a-fA-F]
\H 非16進数字
\R 汎改行 (* 文字集合の中では使用できない)
"\r\n" or \n,\v,\f,\r (* 但し \r\nから\rにはバックトラックしない)
Unicodeの場合:
"\r\n" or \n,\v,\f,\r or U+0085, U+2028, U+2029
\N 非改行文字 (?-m:.)
\O 真任意文字 (?m:.) (* 原作)
\X 拡張書記素房 (?>\O(?:\Y\O)*)
\Xは照合の開始位置が拡張書記素房の境界かどうかを確認しない。
それを確実にしたければ、\y\Xと書けば良い。
Unicodeの場合:
参照 [Unicode Standard Annex #29: http://unicode.org/reports/tr29/]
Unicode以外の場合: (?>\r\n|\O)
Character Property
* \p{property-name}
* \p{^property-name} (negative)
* \P{property-name} (negative)
property-name:
+ 全てのエンコーディングで有効
Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower,
Print, Punct, Space, Upper, XDigit, Word, ASCII,
+ EUC-JP, Shift_JISで有効
Hiragana, Katakana
+ UTF8, UTF16, UTF32で有効
doc/UNICODE_PROPERTIES参照
4. 量指定子
欲張り
? 一回または零回
* 零回以上
+ 一回以上
{n,m} n回以上m回以下
{n,} n回以上
{,n} 零回以上n回以下 ({0,n})
{n} n回
無欲
?? 一回または零回
*? 零回以上
+? 一回以上
{n,m}? n回以上m回以下
{n,}? n回以上
{,n}? 零回以上n回以下 (== {0,n}?)
強欲 (欲張りで、繰り返しに成功した後は回数を減らすような後退再試行をしない)
?+ 一回または零回
*+ 零回以上
++ 一回以上
({n,m}+, {n,}+, {n}+ は、ONIG_SYNTAX_JAVAでのみ強欲な指定子)
例. /a*+/ === /(?>a*)/
5. 錨
^ 行頭
$ 行末
\b 単語境界
\B 非単語境界
\y 拡張書記素房 境界
\Y 拡張書記素房 非境界
\A 文字列先頭
\Z 文字列末尾、または文字列末尾の改行の直前
\z 文字列末尾
\G 探索開始位置
\K 保持 (結果の開始位置をこの位置に保つ)
6. 文字集合
^... 否定 (最低優先度演算子)
x-y 範囲 (xからyまで)
[...] 集合 (文字集合内文字集合)
..&&.. 積演算 (^の次に優先度が低い演算子)
例. [a-w&&[^c-g]z] ==> ([a-w] and ([^c-g] or z)) ==> [abh-w]
※ '[', '-', ']'を、文字集合内で通常文字の意味で使用したい場合には、
これらの文字を'\'で退避修飾しなければならない。
POSIXブラケット ([:xxxxx:], 否定 [:^xxxxx:])
Unicode以外の場合:
alnum 英数字
alpha 英字
ascii 0 - 127
blank \t, \x20
cntrl
digit 0-9
graph 多バイト文字全部を含む
lower
print 多バイト文字全部を含む
punct
space \t, \n, \v, \f, \r, \x20
upper
xdigit 0-9, a-f, A-F
word 英数字, "_" および 多バイト文字
Unicodeの場合:
alnum Letter | Mark | Decimal_Number
alpha Letter | Mark
ascii 0000 - 007F
blank Space_Separator | 0009
cntrl Control | Format | Unassigned | Private_Use | Surrogate
digit Decimal_Number
graph [[:^space:]] && ^Control && ^Unassigned && ^Surrogate
lower Lowercase_Letter
print [[:graph:]] | [[:space:]]
punct Connector_Punctuation | Dash_Punctuation | Close_Punctuation |
Final_Punctuation | Initial_Punctuation | Other_Punctuation |
Open_Punctuation
space Space_Separator | Line_Separator | Paragraph_Separator |
U+0009 | U+000A | U+000B | U+000C | U+000D | U+0085
upper Uppercase_Letter
xdigit U+0030 - U+0039 | U+0041 - U+0046 | U+0061 - U+0066
(0-9, a-f, A-F)
word Letter | Mark | Decimal_Number | Connector_Punctuation
7. 拡張式集合
(?#...) 注釈
(?imxWDSP-imxWDSP) 孤立オプション
i: 大文字小文字照合
m: 複数行
x: 拡張形式
W: wordがASCIIのみ (\w, \p{Word}, [[:word:]])
word境界がASCIIのみ (\b)
D: digitがASCIIのみ (\d, \p{Digit}, [[:digit:]])
S: spaceがASCIIのみ (\s, \p{Space}, [[:space:]])
P: POSIXプロパティがASCIIのみ (W,D,Sを全て含んでいる)
(alnum, alpha, blank, cntrl, digit, graph,
lower, print, punct, space, upper, xdigit, word)
(?imxWDSP-imxWDSP:式) 式オプション
(式) 捕獲式集合
(?:式) 非捕獲式集合
(?=式) 先読み
(?!式) 否定先読み
(?<=式) 戻り読み
(?<!式) 否定戻り読み
戻り読みの式は固定文字長でなければならない。
しかし、最上位の選択子だけは異なった文字長が許される。
例. (?<=a|bc) は許可. (?<=aaa(?:b|cd)) は不許可
否定戻り読みでは、捕獲式集合は許されないが、
非捕獲式集合は許される。
(?>式) 原子的式集合
式全体を通過したとき、式の中での後退再試行を行なわない
(?<name>式), (?'name'式)
名前付き捕獲式集合
式集合に名前を割り当てる(定義する)。
(名前は単語構成文字でなければならない。)
名前だけでなく、捕獲式集合と同様に番号も割り当てられる。
番号指定が禁止されていない状態 (10. 捕獲式集合 を参照)
のときは、名前を使わないで番号でも参照できる。
複数の式集合に同じ名前を与えることは許されている。
この場合には、この名前を使用した後方参照は可能であるが、
部分式呼出しはできない。
<不在機能群>
(?~不在式) 不在繰り返し (*原案 田中哲)
これは.*(より正確には\O*)のように動作するが、<不在式>に
適合する文字列を含まない範囲に制限される。
これは(?~|不在式|\O*)の省略表記である。
(?~|不在式|式) 不在式 (* 原作)
これは<式>のように動作するが、<不在式>に適合する文字列を
含まない範囲に制限される。
例 (?~|345|\d*) "12345678" ==> "12", "1", ""
(?~|不在式) 不在停止 (* 原作)
この演算子を通過した後は、対象文字列の適合範囲の最後が
<不在式>に適合する文字列を含まない範囲に制限される。
(?~|) 範囲消去
不在停止の効果を消して、初期状態にする。
* 不在機能の入れ子には対応しておらず、挙動は不定とする。
(?(条件式)成功式|失敗式) 条件式が成功すれば成功式、失敗すれば失敗式を実行する
この機能の存在理由は、成功式が失敗しても失敗式には
行かないこと。これは他の正規表現で書くことができない。
もうひとつは、条件式が後方参照の番号/名前のとき、
後方参照値の有効性を調べる(文字列と照合はしない)
意味になる。
(?(条件式)成功式) 条件式が成功すれば成功式を実行する
(条件式が通常の式のときには、この構文は不必要だが
今のところエラーにはしない。)
条件式は後方参照の番号/名前または普通の式を使用できる。
条件式が後方参照の場合、成功式と失敗式の両方を省略可能であり、
この場合、後方参照値有効性を調べる(成功/失敗)機能のみになる。
[後方参照値有効性確認器] (* 原作)
(?(n)), (?(-n)), (?(+n)), (?(n+level)) ...
(?(<n>)), (?('-n')), (?(<+n>)) ...
(?(<name>)), (?('name')), (?(<name+level>)) ...
8. 後方参照
\n 番号指定参照 (n >= 1)
\k<n> 番号指定参照 (n >= 1)
\k'n' 番号指定参照 (n >= 1)
\k<-n> 相対番号指定参照 (n >= 1)
\k'-n' 相対番号指定参照 (n >= 1)
\k<+n> 相対番号指定参照 (n >= 1)
\k'+n' 相対番号指定参照 (n >= 1)
\k<name> 名前指定参照
\k'name' 名前指定参照
名前指定参照で、その名前が複数の式集合で多重定義されている場合には、
番号の大きい式集合から優先的に参照される。
(マッチしないときには番号の小さい式集合が参照される)
※ 番号指定参照は、名前付き捕獲式集合が定義され、
かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、
禁止される。(10. 捕獲式集合 を参照)
ネストレベル付き後方参照
level: 0, 1, 2, ...
\k<n+level> (n >= 1)
\k<n-level> (n >= 1)
\k'n+level' (n >= 1)
\k'n-level' (n >= 1)
\k<name+level>
\k<name-level>
\k'name+level'
\k'name-level'
後方参照の位置から相対的な部分式呼出しネストレベルを指定して、そのレベルでの
捕獲値を参照する。
例-1.
/\A(?<a>|.|(?:(?<b>.)\g<a>\k<b+0>))\z/.match("reer")
例-2.
r = Regexp.compile(<<'__REGEXP__'.strip, Regexp::EXTENDED)
(?<element> \g<stag> \g<content>* \g<etag> ){0}
(?<stag> < \g<name> \s* > ){0}
(?<name> [a-zA-Z_:]+ ){0}
(?<content> [^<&]+ (\g<element> | [^<&]+)* ){0}
(?<etag> </ \k<name+1> >){0}
\g<element>
__REGEXP__
p r.match('<foo>f<bar>bbb</bar>f</foo>').captures
9. 部分式呼出し ("田中哲スペシャル") (* 原作)
\g<name> 名前指定呼出し
\g'name' 名前指定呼出し
\g<n> 番号指定呼出し (n >= 1)
\g'n' 番号指定呼出し (n >= 1)
\g<0> 番号指定呼出し(全体呼び出し)
\g'0' 番号指定呼出し(全体呼び出し)
\g<-n> 相対番号指定呼出し (n >= 1)
\g'-n' 相対番号指定呼出し (n >= 1)
\g<+n> 相対番号指定呼出し (n >= 1)
\g'+n' 相対番号指定呼出し (n >= 1)
※ 最左位置での再帰呼出しは禁止される。
例. (?<name>a|\g<name>b) => error
(?<name>a|b\g<name>c) => OK
※ 番号指定呼出しは、名前付き捕獲式集合が定義され、
かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、
禁止される。 (10. 捕獲式集合 を参照)
※ 呼び出された式集合のオプション状態が呼出し側のオプション状態と異なっている
とき、呼び出された側のオプション状態が有効である。
例. (?-i:\g<name>)(?i:(?<name>a)){0} は "A" に照合成功する。
10. 捕獲式集合
捕獲式集合(...)は、以下の条件に応じて振舞が変化する。
(名前付き捕獲式集合は変化しない)
case 1. /.../ (名前付き捕獲式集合は不使用、オプションなし)
(...) は、捕獲式集合として扱われる。
case 2. /.../g (名前付き捕獲式集合は不使用、オプション 'g'を指定)
(...) は、非捕獲式集合として扱われる。
case 3. /..(?<name>..)../ (名前付き捕獲式集合は使用、オプションなし)
(...) は、非捕獲式集合として扱われる。
番号指定参照/呼び出しは不許可。
case 4. /..(?<name>..)../G (名前付き捕獲式集合は使用、オプション 'G'を指定)
(...) は、捕獲式集合として扱われる。
番号指定参照/呼び出しは許可。
但し
g: ONIG_OPTION_DONT_CAPTURE_GROUP
G: ONIG_OPTION_CAPTURE_GROUP
('g'と'G'オプションは、ruby-dev MLで議論された。)
これらの振舞の意味は、
名前付き捕獲と名前無し捕獲を同時に使用する必然性のある場面は少ないであろう
という理由から考えられたものである。
-----------------------------
補記 1. 文法依存オプション
+ ONIG_SYNTAX_ONIGURUMA
(?m): 終止符記号(.)は改行と照合成功
+ ONIG_SYNTAX_PERL と ONIG_SYNTAX_JAVA
(?s): 終止符記号(.)は改行と照合成功
(?m): ^ は改行の直後に照合する、$ は改行の直前に照合する
補記 2. 独自拡張機能
+ 16進数数字、非16進数字 \h, \H
+ 名前付き捕獲式集合 (?<name>...), (?'name'...)
+ 名前指定後方参照 \k<name>
+ 部分式呼出し \g<name>, \g<group-num>
補記 3. Perl 5.8.0と比較して存在しない機能
+ \N{name}
+ \l,\u,\L,\U,\C
+ (?{code})
+ (??{code})
* \Q...\E
但しONIG_SYNTAX_PERLとONIG_SYNTAX_JAVAでは有効
補記 4. Ruby 1.8 の日本語化 GNU regex(version 0.12)との違い
+ 文字Property機能追加 (\p{property}, \P{Property})
+ 16進数字タイプ追加 (\h, \H)
+ 戻り読み機能を追加
+ 強欲な繰り返し指定子を追加 (?+, *+, ++)
+ 文字集合の中の演算子を追加 ([...], &&)
('[' は、文字集合の中で通常の文字として使用するときには
退避修飾しなければならない)
+ 名前付き捕獲式集合と、部分式呼出し機能追加
+ 多バイト文字コードが指定されているとき、
文字集合の中で八進数または十六進数表現の連続は、多バイト符号で表現された
一個の文字と解釈される
(例. [\xa1\xa2], [\xa1\xa7-\xa4\xa1])
+ 文字集合の中で、一バイト文字と多バイト文字の範囲指定は許される。
ex. /[a-あ]/
+ 孤立オプションの有効範囲は、その孤立オプションを含んでいる式集合の
終わりまでである
例. (?:(?i)a|b) は (?:(?i:a|b)) と解釈される、(?:(?i:a)|b)ではない
+ 孤立オプションはその前の式に対して透過的ではない
例. /a(?i)*/ は文法エラーとなる
+ 不完全な繰り返し範囲指定子は通常の文字列として許可される
例. /{/, /({)/, /a{2,3/
+ 否定的POSIXブラケット [:^xxxx:] を追加
+ POSIXブラケット [:ascii:] を追加
+ 先読みの繰り返しは不許可
例. /(?=a)*/, /(?!b){5}/
+ 数値で指定された文字に対しても、大文字小文字照合オプションは有効
例. /\x61/i =~ "A"
+ 繰り返し回数指定で、最低回数の省略(0回)ができる
/a{,n}/ == /a{0,n}/
最低回数と最大回数の同時省略は許されない。(/a{,}/)
+ /a{n}?/は無欲な演算子ではない。
/a{n}?/ == /(?:a{n})?/
+ 無効な後方参照をチェックしてエラーにする。
/\1/, /(a)\2/
+ 無限繰り返しの中で、長さ零での照合成功は繰り返しを中断させるが、
このとき、中断すべきかどうかの判定として、捕獲式集合の捕獲状態の
変化まで考慮している
/(?:()|())*\1\2/ =~ ""
/(?:\1a|())*/ =~ "a"
補記 5. 実装されているが、既定値では有効にしていない機能
+ 捕獲履歴参照
(?@...) と (?@<name>...)
例. /(?@a)*/.match("aaa") ==> [<0-1>, <1-2>, <2-3>]
使用方法は、sample/listcap.cを参照
有効にしていない理由は、どの程度役に立つかはっきりしないため。
補記 6. 問題点
+ エンコーディングバイト値が適正な価かどうかのチェックは行なっていない。
例: UTF-8
* 先頭バイトとして不正なバイトを一文字とみなす
/./u =~ "\xa3"
* 不完全なバイトシーケンスのチェックをしない
/\w+/u =~ "a\xf3\x8ec"
これを調べることは可能ではあるが、遅くなるので行なわない。
文字列として、そのようなバイト列を指定した場合の動作は保証しない。
終り