1鬼車 正規表現 Version 6.8.0    2018/07/26
2
3使用文法: ONIG_SYNTAX_ONIGURUMA (既定値)
4
5
61. 基本要素
7
8  \       退避修飾 (エスケープ)  正規表現記号の有効/無効の制御
9  |       選択子
10  (...)   式集合   (グループ)
11  [...]   文字集合 (文字クラス)
12
13
142. 文字
15
16  \t              水平タブ         (0x09)
17  \v              垂直タブ         (0x0B)
18  \n              改行             (0x0A)
19  \r              復帰             (0x0D)
20  \b              後退空白         (0x08)
21  \f              改頁             (0x0C)
22  \a              鐘               (0x07)
23  \e              退避修飾         (0x1B)
24  \nnn            八進数表現        符号化バイト値(の一部)
25  \o{17777777777} 拡張八進数表現    コードポイント値
26  \uHHHH          拡張十六進数表現  コードポイント値
27  \xHH            十六進数表現      符号化バイト値(の一部)
28  \x{7HHHHHHH}    拡張十六進数表現  コードポイント値
29  \cx             制御文字表現      コードポイント値
30  \C-x            制御文字表現      コードポイント値
31  \M-x            超  (x|0x80)     コードポイント値
32  \M-\C-x         超 + 制御文字表現 コードポイント値
33
34  ※ \bは、文字集合内でのみ有効
35
36
373. 文字種
38
39  .        任意文字 (改行を除く: オプションに依存)
40
41  \w       単語構成文字
42
43           Unicode以外の場合:
44             英数字, "_" および 多バイト文字。
45
46           Unicodeの場合:
47             General_Category -- (Letter|Mark|Number|Connector_Punctuation)
48
49  \W       非単語構成文字
50
51  \s       空白文字
52
53           Unicode以外の場合:
54             \t, \n, \v, \f, \r, \x20
55
56           Unicodeの場合:
57             U+0009, U+000A, U+000B, U+000C, U+000D, U+0085(NEL),
58             General_Category -- Line_Separator
59                              -- Paragraph_Separator
60                              -- Space_Separator
61
62  \S       非空白文字
63
64  \d       10進数字
65
66           Unicodeの場合: General_Category -- Decimal_Number
67
68  \D       非10進数字
69
70  \h       16進数字    [0-9a-fA-F]
71
72  \H       非16進数字
73
74  \R       汎改行  (* 文字集合の中では使用できない)
75           "\r\n" or \n,\v,\f,\r  (* 但し \r\nから\rにはバックトラックしない)
76
77           Unicodeの場合:
78             "\r\n" or \n,\v,\f,\r or U+0085, U+2028, U+2029
79
80  \N       非改行文字  (?-m:.)
81
82  \O       真任意文字  (?m:.)      (* 原作)
83
84  \X       拡張書記素房     (?>\O(?:\Y\O)*)
85
86           \Xは照合の開始位置が拡張書記素房の境界かどうかを確認しない。
87           それを確実にしたければ、\y\Xと書けば良い。
88
89           Unicodeの場合:
90             参照 [Unicode Standard Annex #29: http://unicode.org/reports/tr29/]
91
92           Unicode以外の場合:   (?>\r\n|\O)
93
94
95  Character Property
96
97    * \p{property-name}
98    * \p{^property-name}    (negative)
99    * \P{property-name}     (negative)
100
101    property-name:
102
103     + 全てのエンコーディングで有効
104       Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower,
105       Print, Punct, Space, Upper, XDigit, Word, ASCII,
106
107     + EUC-JP, Shift_JISで有効
108       Hiragana, Katakana
109
110     + UTF8, UTF16, UTF32で有効
111       doc/UNICODE_PROPERTIES参照
112
113
114
1154. 量指定子
116
117  欲張り
118
119    ?       一回または零回
120    *       零回以上
121    +       一回以上
122    {n,m}   n回以上m回以下
123    {n,}    n回以上
124    {,n}    零回以上n回以下 ({0,n})
125    {n}     n回
126
127  無欲
128
129    ??      一回または零回
130    *?      零回以上
131    +?      一回以上
132    {n,m}?  n回以上m回以下
133    {n,}?   n回以上
134    {,n}?   零回以上n回以下 (== {0,n}?)
135
136  強欲 (欲張りで、繰り返しに成功した後は回数を減らすような後退再試行をしない)
137
138    ?+      一回または零回
139    *+      零回以上
140    ++      一回以上
141
142    ({n,m}+, {n,}+, {n}+ は、ONIG_SYNTAX_JAVAでのみ強欲な指定子)
143
144    例. /a*+/ === /(?>a*)/
145
146
1475. 錨
148
149  ^       行頭
150  $       行末
151  \b      単語境界
152  \B      非単語境界
153  \y      拡張書記素房 境界
154  \Y      拡張書記素房 非境界
155
156  \A      文字列先頭
157  \Z      文字列末尾、または文字列末尾の改行の直前
158  \z      文字列末尾
159  \G      探索開始位置
160  \K      保持 (結果の開始位置をこの位置に保つ)
161
162
163
1646. 文字集合
165
166  ^...    否定   (最低優先度演算子)
167  x-y     範囲   (xからyまで)
168  [...]   集合   (文字集合内文字集合)
169  ..&&..  積演算 (^の次に優先度が低い演算子)
170
171     例. [a-w&&[^c-g]z] ==> ([a-w] and ([^c-g] or z)) ==> [abh-w]
172
173  ※ '[', '-', ']'を、文字集合内で通常文字の意味で使用したい場合には、
174     これらの文字を'\'で退避修飾しなければならない。
175
176
177  POSIXブラケット ([:xxxxx:], 否定 [:^xxxxx:])
178
179    Unicode以外の場合:
180
181      alnum    英数字
182      alpha    英字
183      ascii    0 - 127
184      blank    \t, \x20
185      cntrl
186      digit    0-9
187      graph    多バイト文字全部を含む
188      lower
189      print    多バイト文字全部を含む
190      punct
191      space    \t, \n, \v, \f, \r, \x20
192      upper
193      xdigit   0-9, a-f, A-F
194      word     英数字, "_" および 多バイト文字
195
196    Unicodeの場合:
197
198      alnum    Letter | Mark | Decimal_Number
199      alpha    Letter | Mark
200      ascii    0000 - 007F
201      blank    Space_Separator | 0009
202      cntrl    Control | Format | Unassigned | Private_Use | Surrogate
203      digit    Decimal_Number
204      graph    [[:^space:]] && ^Control && ^Unassigned && ^Surrogate
205      lower    Lowercase_Letter
206      print    [[:graph:]] | [[:space:]]
207      punct    Connector_Punctuation | Dash_Punctuation | Close_Punctuation |
208               Final_Punctuation | Initial_Punctuation | Other_Punctuation |
209               Open_Punctuation
210      space    Space_Separator | Line_Separator | Paragraph_Separator |
211               U+0009 | U+000A | U+000B | U+000C | U+000D | U+0085
212      upper    Uppercase_Letter
213      xdigit   U+0030 - U+0039 | U+0041 - U+0046 | U+0061 - U+0066
214               (0-9, a-f, A-F)
215      word     Letter | Mark | Decimal_Number | Connector_Punctuation
216
217
218
2197. 拡張式集合
220
221  (?#...)           注釈
222
223  (?imxWDSP-imxWDSP:式)   式オプション
224
225                            i: 大文字小文字照合
226                            m: 複数行
227                            x: 拡張形式
228                            W: wordがASCIIのみ (\w, \p{Word}, [[:word:]])
229                               word境界がASCIIのみ (\b)
230                            D: digitがASCIIのみ (\d, \p{Digit}, [[:digit:]])
231                            S: spaceがASCIIのみ (\s, \p{Space}, [[:space:]])
232                            P: POSIXプロパティがASCIIのみ (W,D,Sを全て含んでいる)
233                               (alnum, alpha, blank, cntrl, digit, graph,
234                                lower, print, punct, space, upper, xdigit, word)
235
236  (?imxWDSP-imxWDSP)  孤立オプション
237
238                      * これは次の')'またはパターンの終わりまでのグループを形成する
239                        /ab(?i)c|def|gh/ == /ab(?i:c|def|gh)/
240
241
242  (式)              捕獲式集合
243  (?:式)            非捕獲式集合
244
245  (?=式)            先読み
246  (?!式)            否定先読み
247  (?<=式)           戻り読み
248  (?<!式)           否定戻り読み
249
250                    戻り読みの式は固定文字長でなければならない。
251                    しかし、最上位の選択子だけは異なった文字長が許される。
252                    例. (?<=a|bc) は許可. (?<=aaa(?:b|cd)) は不許可
253
254                    否定戻り読みでは、捕獲式集合は許されないが、
255                    非捕獲式集合は許される。
256
257  (?>式)            原子的式集合
258                    式全体を通過したとき、式の中での後退再試行を行なわない
259
260  (?<name>式), (?'name'式)
261                    名前付き捕獲式集合
262                    式集合に名前を割り当てる(定義する)。
263                    (名前は単語構成文字でなければならない。)
264
265                    名前だけでなく、捕獲式集合と同様に番号も割り当てられる。
266                    番号指定が禁止されていない状態 (10. 捕獲式集合 を参照)
267                    のときは、名前を使わないで番号でも参照できる。
268
269                    複数の式集合に同じ名前を与えることは許されている。
270                    この場合には、この名前を使用した後方参照は可能であるが、
271                    部分式呼出しはできない。
272
273
274  <呼び出し>
275
276  * 内容の呼び出し
277  (?{...contents...})           前進中のみの呼び出し
278  (?{...contents...}D)          Dは方向指定文字
279                                D = 'X': 前進中および後退中
280                                    '<': 後退中のみ
281                                    '>': 前進中のみ
282  (?{...contents...}[tag])      名札付き
283  (?{...contents...}[tag]D)
284
285                              * エスケープ文字はcontentsの中で何の機能も持たない
286                              * contentsは、'{'文字で始まってはならない
287
288  (?{{{...contents...}}})     contentsの中のn個連続の'}'は、(n+1)個連続の{{{...}}}
289                              の中で許される
290
291    tagに許される文字: _ A-Z a-z 0-9 (* 最初の文字: _ A-Z a-z)
292
293
294  * 名前の呼び出し
295  (*name)
296  (*name{args...})         引数付き
297  (*name[tag])             名札付き
298  (*name[tag]{args...})
299
300    nameに許される文字: _ A-Z a-z 0-9 (* 最初の文字: _ A-Z a-z)
301    tag に許される文字: _ A-Z a-z 0-9 (* 最初の文字: _ A-Z a-z)
302
303
304
305  <不在機能群>
306
307  (?~不在式)        不在繰り返し  (*原案 田中哲)
308                    これは .*(より正確には\O*)のように動作するが、<不在式>に
309                    適合する文字列を含まない範囲に制限される。
310                    これは(?~|不在式|\O*)の省略表記である。
311
312  (?~|不在式|式)    不在式  (* 原作)
313                    これは<式>のように動作するが、<不在式>に適合する文字列を
314                    含まない範囲に制限される。
315
316                    例 (?~|345|\d*)  "12345678"  ==> "12", "1", ""
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    (?(n)), (?(-n)), (?(+n)), (?(n+level)) ...
349    (?(<n>)), (?('-n')), (?(<+n>)) ...
350    (?(<name>)), (?('name')), (?(<name+level>)) ...
351
352
353
3548. 後方参照
355
356  \n          番号指定参照     (n >= 1)
357  \k<n>       番号指定参照     (n >= 1)
358  \k'n'       番号指定参照     (n >= 1)
359  \k<-n>      相対番号指定参照 (n >= 1)
360  \k'-n'      相対番号指定参照 (n >= 1)
361  \k<+n>      相対番号指定参照 (n >= 1)
362  \k'+n'      相対番号指定参照 (n >= 1)
363  \k<name>    名前指定参照
364  \k'name'    名前指定参照
365
366  名前指定参照で、その名前が複数の式集合で多重定義されている場合には、
367  番号の大きい式集合から優先的に参照される。
368  (マッチしないときには番号の小さい式集合が参照される)
369
370  ※ 番号指定参照は、名前付き捕獲式集合が定義され、
371     かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、
372     禁止される。(10. 捕獲式集合 を参照)
373
374
375  ネストレベル付き後方参照
376
377    level: 0, 1, 2, ...
378
379    \k<n+level>     (n >= 1)
380    \k<n-level>     (n >= 1)
381    \k'n+level'     (n >= 1)
382    \k'n-level'     (n >= 1)
383
384    \k<name+level>
385    \k<name-level>
386    \k'name+level'
387    \k'name-level'
388
389    後方参照の位置から相対的な部分式呼出しネストレベルを指定して、そのレベルでの
390    捕獲値を参照する。
391
392    例-1.
393
394      /\A(?<a>|.|(?:(?<b>.)\g<a>\k<b+0>))\z/.match("reer")
395
396    例-2.
397
398      r = Regexp.compile(<<'__REGEXP__'.strip, Regexp::EXTENDED)
399      (?<element> \g<stag> \g<content>* \g<etag> ){0}
400      (?<stag> < \g<name> \s* > ){0}
401      (?<name> [a-zA-Z_:]+ ){0}
402      (?<content> [^<&]+ (\g<element> | [^<&]+)* ){0}
403      (?<etag> </ \k<name+1> >){0}
404      \g<element>
405      __REGEXP__
406
407      p r.match('<foo>f<bar>bbb</bar>f</foo>').captures
408
409
410
4119. 部分式呼出し ("田中哲スペシャル")   (* 原作)
412
413  \g<name>    名前指定呼出し
414  \g'name'    名前指定呼出し
415  \g<n>       番号指定呼出し    (n >= 1)
416  \g'n'       番号指定呼出し    (n >= 1)
417  \g<0>       番号指定呼出し(全体呼び出し)
418  \g'0'       番号指定呼出し(全体呼び出し)
419  \g<-n>      相対番号指定呼出し (n >= 1)
420  \g'-n'      相対番号指定呼出し (n >= 1)
421  \g<+n>      相対番号指定呼出し (n >= 1)
422  \g'+n'      相対番号指定呼出し (n >= 1)
423
424  ※ 最左位置での再帰呼出しは禁止される。
425     例. (?<name>a|\g<name>b)   => error
426         (?<name>a|b\g<name>c)  => OK
427
428  ※ 番号指定呼出しは、名前付き捕獲式集合が定義され、
429     かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、
430     禁止される。 (10. 捕獲式集合 を参照)
431
432  ※ 呼び出された式集合のオプション状態が呼出し側のオプション状態と異なっている
433     とき、呼び出された側のオプション状態が有効である。
434
435     例. (?-i:\g<name>)(?i:(?<name>a)){0} は "A" に照合成功する。
436
437
43810. 捕獲式集合
439
440  捕獲式集合(...)は、以下の条件に応じて振舞が変化する。
441  (名前付き捕獲式集合は変化しない)
442
443  case 1. /.../     (名前付き捕獲式集合は不使用、オプションなし)
444
445     (...) は、捕獲式集合として扱われる。
446
447  case 2. /.../g    (名前付き捕獲式集合は不使用、オプション 'g'を指定)
448
449     (...) は、非捕獲式集合として扱われる。
450
451  case 3. /..(?<name>..)../   (名前付き捕獲式集合は使用、オプションなし)
452
453     (...) は、非捕獲式集合として扱われる。
454     番号指定参照/呼び出しは不許可。
455
456  case 4. /..(?<name>..)../G  (名前付き捕獲式集合は使用、オプション 'G'を指定)
457
458     (...) は、捕獲式集合として扱われる。
459     番号指定参照/呼び出しは許可。
460
461  但し
462    g: ONIG_OPTION_DONT_CAPTURE_GROUP
463    G: ONIG_OPTION_CAPTURE_GROUP
464    ('g'と'G'オプションは、ruby-dev MLで議論された。)
465
466  これらの振舞の意味は、
467  名前付き捕獲と名前無し捕獲を同時に使用する必然性のある場面は少ないであろう
468  という理由から考えられたものである。
469
470
471-----------------------------
472補記 1. 文法依存オプション
473
474   + ONIG_SYNTAX_ONIGURUMA
475     (?m): 終止符記号(.)は改行と照合成功
476
477   + ONIG_SYNTAX_PERL と ONIG_SYNTAX_JAVA
478     (?s): 終止符記号(.)は改行と照合成功
479     (?m): ^ は改行の直後に照合する、$ は改行の直前に照合する
480
481
482補記 2. 独自拡張機能
483
484   + 16進数数字、非16進数字  \h, \H
485   + 名前付き捕獲式集合      (?<name>...), (?'name'...)
486   + 名前指定後方参照        \k<name>
487   + 部分式呼出し            \g<name>, \g<group-num>
488
489
490補記 3. Perl 5.8.0と比較して存在しない機能
491
492   + \N{name}
493   + \l,\u,\L,\U,\C
494   + (??{code})
495
496   * \Q...\E
497     但しONIG_SYNTAX_PERLとONIG_SYNTAX_JAVAでは有効
498
499
500補記 4. Ruby 1.8 の日本語化 GNU regex(version 0.12)との違い
501
502   + 文字Property機能追加 (\p{property}, \P{Property})
503   + 16進数字タイプ追加 (\h, \H)
504   + 戻り読み機能を追加
505   + 強欲な繰り返し指定子を追加 (?+, *+, ++)
506   + 文字集合の中の演算子を追加 ([...], &&)
507     ('[' は、文字集合の中で通常の文字として使用するときには
508      退避修飾しなければならない)
509   + 名前付き捕獲式集合と、部分式呼出し機能追加
510   + 多バイト文字コードが指定されているとき、
511     文字集合の中で八進数または十六進数表現の連続は、多バイト符号で表現された
512     一個の文字と解釈される
513     (例. [\xa1\xa2], [\xa1\xa7-\xa4\xa1])
514   + 文字集合の中で、一バイト文字と多バイト文字の範囲指定は許される。
515     ex. /[a-あ]/
516   + 孤立オプションの有効範囲は、その孤立オプションを含んでいる式集合の
517     終わりまでである
518     例. (?:(?i)a|b) は (?:(?i:a|b)) と解釈される、(?:(?i:a)|b)ではない
519   + 孤立オプションはその前の式に対して透過的ではない
520     例. /a(?i)*/ は文法エラーとなる
521   + 不完全な繰り返し範囲指定子は通常の文字列として許可される
522     例. /{/, /({)/, /a{2,3/
523   + 否定的POSIXブラケット [:^xxxx:] を追加
524   + POSIXブラケット [:ascii:] を追加
525   + 先読みの繰り返しは不許可
526     例. /(?=a)*/, /(?!b){5}/
527   + 数値で指定された文字に対しても、大文字小文字照合オプションは有効
528     例. /\x61/i =~ "A"
529   + 繰り返し回数指定で、最低回数の省略(0回)ができる
530     /a{,n}/ == /a{0,n}/
531     最低回数と最大回数の同時省略は許されない。(/a{,}/)
532   + /a{n}?/は無欲な演算子ではない。
533     /a{n}?/ == /(?:a{n})?/
534   + 無効な後方参照をチェックしてエラーにする。
535     /\1/, /(a)\2/
536   + 無限繰り返しの中で、長さ零での照合成功は繰り返しを中断させるが、
537     このとき、中断すべきかどうかの判定として、捕獲式集合の捕獲状態の
538     変化まで考慮している
539     /(?:()|())*\1\2/ =~ ""
540     /(?:\1a|())*/ =~ "a"
541
542
543
544補記 5. 実装されているが、既定値では有効にしていない機能
545
546   + 捕獲履歴参照
547
548     (?@...) と (?@<name>...)
549
550     例. /(?@a)*/.match("aaa") ==> [<0-1>, <1-2>, <2-3>]
551
552     使用方法は、sample/listcap.cを参照
553
554     有効にしていない理由は、どの程度役に立つかはっきりしないため。
555
556
557補記 6. 問題点
558
559   + エンコーディングバイト値が適正な価かどうかのチェックは行なっていない。
560
561     例: UTF-8
562
563     * 先頭バイトとして不正なバイトを一文字とみなす
564       /./u =~ "\xa3"
565
566     * 不完全なバイトシーケンスのチェックをしない
567      /\w+/u =~ "a\xf3\x8ec"
568
569     これを調べることは可能ではあるが、遅くなるので行なわない。
570
571     文字列として、そのようなバイト列を指定した場合の動作は保証しない。
572
573終り
574