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