鬼車 正規表現 Version 6.6.0 2017/08/24 使用文法: ONIG_SYNTAX_RUBY (既定値) 1. 基本要素 \ 退避修飾 (エスケープ) 正規表現記号の有効/無効の制御 | 選択子 (...) 式集合 (グループ) [...] 文字集合 (文字クラス) 2. 文字 \t 水平タブ (0x09) \v 垂直タブ (0x0B) \n 改行 (0x0A) \r 復帰 (0x0D) \b 後退空白 (0x08) \f 改頁 (0x0C) \a 鐘 (0x07) \e 退避修飾 (0x1B) \nnn 八進数表現 符号化バイト値(の一部) \o{17777777777} 拡張八進数表現 コードポイント値 \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:式) 式オプション (式) 捕獲式集合 (?:式) 非捕獲式集合 (?=式) 先読み (?!式) 否定先読み (?<=式) 戻り読み (?式) 原子的式集合 式全体を通過したとき、式の中での後退再試行を行なわない (?式), (?'name'式) 名前付き捕獲式集合 式集合に名前を割り当てる(定義する)。 (名前は単語構成文字でなければならない。) 名前だけでなく、捕獲式集合と同様に番号も割り当てられる。 番号指定が禁止されていない状態 (10. 捕獲式集合 を参照) のときは、名前を使わないで番号でも参照できる。 複数の式集合に同じ名前を与えることは許されている。 この場合には、この名前を使用した後方参照は可能であるが、 部分式呼出しはできない。 <不在機能群> (?~不在式) 不在繰り返し (*原案 田中哲) これは.*(より正確には\O*)のように動作するが、<不在式>に 適合する文字列を含まない範囲に制限される。 これは(?~|不在式|\O*)の省略表記である。 (?~|不在式|式) 不在式 (* 原作) これは<式>のように動作するが、<不在式>に適合する文字列を 含まない範囲に制限される。 例 (?~|345|\d*) "12345678" ==> "12", "1", "" (?~|不在式) 不在停止 (* 原作) この演算子を通過した後は、対象文字列の適合範囲の最後が <不在式>に適合する文字列を含まない範囲に制限される。 (?~|) 範囲消去 不在停止の効果を消して、初期状態にする。 * 不在機能の入れ子には対応しておらず、挙動は不定とする。 (?(条件式)成功式|失敗式) 条件式が成功すれば成功式、失敗すれば失敗式を実行する この機能の存在理由は、成功式が失敗しても失敗式には 行かないこと。これは他の正規表現で書くことができない。 もうひとつは、条件式が後方参照の番号/名前のとき、 後方参照値の有効性を調べる(文字列と照合はしない) 意味になる。 (?(条件式)成功式) 条件式が成功すれば成功式を実行する (条件式が通常の式のときには、この構文は不必要だが 今のところエラーにはしない。) 条件式は後方参照の番号/名前または普通の式を使用できる。 条件式が後方参照の場合、成功式と失敗式の両方を省略可能であり、 この場合、後方参照値有効性を調べる(成功/失敗)機能のみになる。 [後方参照値有効性確認器] (* 原作) (?(n)), (?(-n)), (?(+n)), (?(n+level)) ... (?()), (?('-n')), (?(<+n>)) ... (?()), (?('name')), (?()) ... 8. 後方参照 \n 番号指定参照 (n >= 1) \k 番号指定参照 (n >= 1) \k'n' 番号指定参照 (n >= 1) \k<-n> 相対番号指定参照 (n >= 1) \k'-n' 相対番号指定参照 (n >= 1) \k<+n> 相対番号指定参照 (n >= 1) \k'+n' 相対番号指定参照 (n >= 1) \k 名前指定参照 \k'name' 名前指定参照 名前指定参照で、その名前が複数の式集合で多重定義されている場合には、 番号の大きい式集合から優先的に参照される。 (マッチしないときには番号の小さい式集合が参照される) ※ 番号指定参照は、名前付き捕獲式集合が定義され、 かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、 禁止される。(10. 捕獲式集合 を参照) ネストレベル付き後方参照 level: 0, 1, 2, ... \k (n >= 1) \k (n >= 1) \k'n+level' (n >= 1) \k'n-level' (n >= 1) \k \k \k'name+level' \k'name-level' 後方参照の位置から相対的な部分式呼出しネストレベルを指定して、そのレベルでの 捕獲値を参照する。 例-1. /\A(?|.|(?:(?.)\g\k))\z/.match("reer") 例-2. r = Regexp.compile(<<'__REGEXP__'.strip, Regexp::EXTENDED) (? \g \g* \g ){0} (? < \g \s* > ){0} (? [a-zA-Z_:]+ ){0} (? [^<&]+ (\g | [^<&]+)* ){0} (? >){0} \g __REGEXP__ p r.match('fbbbf').captures 9. 部分式呼出し ("田中哲スペシャル") (* 原作) \g 名前指定呼出し \g'name' 名前指定呼出し \g 番号指定呼出し (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) ※ 最左位置での再帰呼出しは禁止される。 例. (?a|\gb) => error (?a|b\gc) => OK ※ 番号指定呼出しは、名前付き捕獲式集合が定義され、 かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、 禁止される。 (10. 捕獲式集合 を参照) ※ 呼び出された式集合のオプション状態が呼出し側のオプション状態と異なっている とき、呼び出された側のオプション状態が有効である。 例. (?-i:\g)(?i:(?a)){0} は "A" に照合成功する。 10. 捕獲式集合 捕獲式集合(...)は、以下の条件に応じて振舞が変化する。 (名前付き捕獲式集合は変化しない) case 1. /.../ (名前付き捕獲式集合は不使用、オプションなし) (...) は、捕獲式集合として扱われる。 case 2. /.../g (名前付き捕獲式集合は不使用、オプション 'g'を指定) (...) は、非捕獲式集合として扱われる。 case 3. /..(?..)../ (名前付き捕獲式集合は使用、オプションなし) (...) は、非捕獲式集合として扱われる。 番号指定参照/呼び出しは不許可。 case 4. /..(?..)../G (名前付き捕獲式集合は使用、オプション 'G'を指定) (...) は、捕獲式集合として扱われる。 番号指定参照/呼び出しは許可。 但し g: ONIG_OPTION_DONT_CAPTURE_GROUP G: ONIG_OPTION_CAPTURE_GROUP ('g'と'G'オプションは、ruby-dev MLで議論された。) これらの振舞の意味は、 名前付き捕獲と名前無し捕獲を同時に使用する必然性のある場面は少ないであろう という理由から考えられたものである。 ----------------------------- 補記 1. 文法依存オプション + ONIG_SYNTAX_RUBY (?m): 終止符記号(.)は改行と照合成功 + ONIG_SYNTAX_PERL と ONIG_SYNTAX_JAVA (?s): 終止符記号(.)は改行と照合成功 (?m): ^ は改行の直後に照合する、$ は改行の直前に照合する 補記 2. 独自拡張機能 + 16進数数字、非16進数字 \h, \H + 名前付き捕獲式集合 (?...), (?'name'...) + 名前指定後方参照 \k + 部分式呼出し \g, \g 補記 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. 実装されているが、既定値では有効にしていない機能 + 捕獲履歴参照 (?@...) と (?@...) 例. /(?@a)*/.match("aaa") ==> [<0-1>, <1-2>, <2-3>] 使用方法は、sample/listcap.cを参照 有効にしていない理由は、どの程度役に立つかはっきりしないため。 補記 6. 問題点 + エンコーディングバイト値が適正な価かどうかのチェックは行なっていない。 例: UTF-8 * 先頭バイトとして不正なバイトを一文字とみなす /./u =~ "\xa3" * 不完全なバイトシーケンスのチェックをしない /\w+/u =~ "a\xf3\x8ec" これを調べることは可能ではあるが、遅くなるので行なわない。 文字列として、そのようなバイト列を指定した場合の動作は保証しない。 終り