Blame doc/RE.ja

Packit b89d10
鬼車 正規表現 Version 6.8.0    2018/04/13
Packit b89d10
Packit b89d10
使用文法: ONIG_SYNTAX_ONIGURUMA (既定値)
Packit b89d10
Packit b89d10
Packit b89d10
1. 基本要素
Packit b89d10
Packit b89d10
  \       退避修飾 (エスケープ)  正規表現記号の有効/無効の制御
Packit b89d10
  |       選択子
Packit b89d10
  (...)   式集合   (グループ)
Packit b89d10
  [...]   文字集合 (文字クラス)
Packit b89d10
Packit b89d10
Packit b89d10
2. 文字
Packit b89d10
Packit b89d10
  \t              水平タブ         (0x09)
Packit b89d10
  \v              垂直タブ         (0x0B)
Packit b89d10
  \n              改行             (0x0A)
Packit b89d10
  \r              復帰             (0x0D)
Packit b89d10
  \b              後退空白         (0x08)
Packit b89d10
  \f              改頁             (0x0C)
Packit b89d10
  \a              鐘               (0x07)
Packit b89d10
  \e              退避修飾         (0x1B)
Packit b89d10
  \nnn            八進数表現        符号化バイト値(の一部)
Packit b89d10
  \o{17777777777} 拡張八進数表現    コードポイント値
Packit b89d10
  \uHHHH          拡張十六進数表現  コードポイント値
Packit b89d10
  \xHH            十六進数表現      符号化バイト値(の一部)
Packit b89d10
  \x{7HHHHHHH}    拡張十六進数表現  コードポイント値
Packit b89d10
  \cx             制御文字表現      コードポイント値
Packit b89d10
  \C-x            制御文字表現      コードポイント値
Packit b89d10
  \M-x            超  (x|0x80)     コードポイント値
Packit b89d10
  \M-\C-x         超 + 制御文字表現 コードポイント値
Packit b89d10
Packit b89d10
  ※ \bは、文字集合内でのみ有効
Packit b89d10
Packit b89d10
Packit b89d10
3. 文字種
Packit b89d10
Packit b89d10
  .        任意文字 (改行を除く: オプションに依存)
Packit b89d10
Packit b89d10
  \w       単語構成文字
Packit b89d10
Packit b89d10
           Unicode以外の場合:
Packit b89d10
             英数字, "_" および 多バイト文字。
Packit b89d10
Packit b89d10
           Unicodeの場合:
Packit b89d10
             General_Category -- (Letter|Mark|Number|Connector_Punctuation)
Packit b89d10
Packit b89d10
  \W       非単語構成文字
Packit b89d10
Packit b89d10
  \s       空白文字
Packit b89d10
Packit b89d10
           Unicode以外の場合:
Packit b89d10
             \t, \n, \v, \f, \r, \x20
Packit b89d10
Packit b89d10
           Unicodeの場合:
Packit b89d10
             U+0009, U+000A, U+000B, U+000C, U+000D, U+0085(NEL), 
Packit b89d10
             General_Category -- Line_Separator
Packit b89d10
                              -- Paragraph_Separator
Packit b89d10
                              -- Space_Separator
Packit b89d10
Packit b89d10
  \S       非空白文字
Packit b89d10
Packit b89d10
  \d       10進数字
Packit b89d10
Packit b89d10
           Unicodeの場合: General_Category -- Decimal_Number
Packit b89d10
Packit b89d10
  \D       非10進数字
Packit b89d10
Packit b89d10
  \h       16進数字    [0-9a-fA-F]
Packit b89d10
Packit b89d10
  \H       非16進数字
Packit b89d10
Packit b89d10
  \R       汎改行  (* 文字集合の中では使用できない)
Packit b89d10
           "\r\n" or \n,\v,\f,\r  (* 但し \r\nから\rにはバックトラックしない)
Packit b89d10
Packit b89d10
           Unicodeの場合:
Packit b89d10
             "\r\n" or \n,\v,\f,\r or U+0085, U+2028, U+2029
Packit b89d10
Packit b89d10
  \N       非改行文字  (?-m:.)
Packit b89d10
Packit b89d10
  \O       真任意文字  (?m:.)      (* 原作)
Packit b89d10
Packit b89d10
  \X       拡張書記素房     (?>\O(?:\Y\O)*)
Packit b89d10
Packit b89d10
           \Xは照合の開始位置が拡張書記素房の境界かどうかを確認しない。
Packit b89d10
           それを確実にしたければ、\y\Xと書けば良い。
Packit b89d10
Packit b89d10
           Unicodeの場合:
Packit b89d10
             参照 [Unicode Standard Annex #29: http://unicode.org/reports/tr29/]
Packit b89d10
Packit b89d10
           Unicode以外の場合:   (?>\r\n|\O)
Packit b89d10
Packit b89d10
Packit b89d10
  Character Property
Packit b89d10
Packit b89d10
    * \p{property-name}
Packit b89d10
    * \p{^property-name}    (negative)
Packit b89d10
    * \P{property-name}     (negative)
Packit b89d10
Packit b89d10
    property-name:
Packit b89d10
Packit b89d10
     + 全てのエンコーディングで有効
Packit b89d10
       Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower,
Packit b89d10
       Print, Punct, Space, Upper, XDigit, Word, ASCII,
Packit b89d10
Packit b89d10
     + EUC-JP, Shift_JISで有効
Packit b89d10
       Hiragana, Katakana
Packit b89d10
Packit b89d10
     + UTF8, UTF16, UTF32で有効
Packit b89d10
       doc/UNICODE_PROPERTIES参照
Packit b89d10
Packit b89d10
Packit b89d10
Packit b89d10
4. 量指定子
Packit b89d10
Packit b89d10
  欲張り
Packit b89d10
Packit b89d10
    ?       一回または零回
Packit b89d10
    *       零回以上
Packit b89d10
    +       一回以上
Packit b89d10
    {n,m}   n回以上m回以下
Packit b89d10
    {n,}    n回以上
Packit b89d10
    {,n}    零回以上n回以下 ({0,n})
Packit b89d10
    {n}     n回
Packit b89d10
Packit b89d10
  無欲
Packit b89d10
Packit b89d10
    ??      一回または零回
Packit b89d10
    *?      零回以上
Packit b89d10
    +?      一回以上
Packit b89d10
    {n,m}?  n回以上m回以下
Packit b89d10
    {n,}?   n回以上
Packit b89d10
    {,n}?   零回以上n回以下 (== {0,n}?)
Packit b89d10
Packit b89d10
  強欲 (欲張りで、繰り返しに成功した後は回数を減らすような後退再試行をしない)
Packit b89d10
Packit b89d10
    ?+      一回または零回
Packit b89d10
    *+      零回以上
Packit b89d10
    ++      一回以上
Packit b89d10
Packit b89d10
    ({n,m}+, {n,}+, {n}+ は、ONIG_SYNTAX_JAVAでのみ強欲な指定子)
Packit b89d10
Packit b89d10
    例. /a*+/ === /(?>a*)/
Packit b89d10
Packit b89d10
Packit b89d10
5. 錨
Packit b89d10
Packit b89d10
  ^       行頭
Packit b89d10
  $       行末
Packit b89d10
  \b      単語境界
Packit b89d10
  \B      非単語境界
Packit b89d10
  \y      拡張書記素房 境界
Packit b89d10
  \Y      拡張書記素房 非境界
Packit b89d10
Packit b89d10
  \A      文字列先頭
Packit b89d10
  \Z      文字列末尾、または文字列末尾の改行の直前
Packit b89d10
  \z      文字列末尾
Packit b89d10
  \G      探索開始位置
Packit b89d10
  \K      保持 (結果の開始位置をこの位置に保つ)
Packit b89d10
Packit b89d10
Packit b89d10
Packit b89d10
6. 文字集合
Packit b89d10
Packit b89d10
  ^...    否定   (最低優先度演算子)
Packit b89d10
  x-y     範囲   (xからyまで)
Packit b89d10
  [...]   集合   (文字集合内文字集合)
Packit b89d10
  ..&&..  積演算 (^の次に優先度が低い演算子)
Packit b89d10
Packit b89d10
     例. [a-w&&[^c-g]z] ==> ([a-w] and ([^c-g] or z)) ==> [abh-w]
Packit b89d10
Packit b89d10
  ※ '[', '-', ']'を、文字集合内で通常文字の意味で使用したい場合には、
Packit b89d10
     これらの文字を'\'で退避修飾しなければならない。
Packit b89d10
Packit b89d10
Packit b89d10
  POSIXブラケット ([:xxxxx:], 否定 [:^xxxxx:])
Packit b89d10
Packit b89d10
    Unicode以外の場合:
Packit b89d10
Packit b89d10
      alnum    英数字
Packit b89d10
      alpha    英字
Packit b89d10
      ascii    0 - 127
Packit b89d10
      blank    \t, \x20
Packit b89d10
      cntrl
Packit b89d10
      digit    0-9
Packit b89d10
      graph    多バイト文字全部を含む
Packit b89d10
      lower
Packit b89d10
      print    多バイト文字全部を含む
Packit b89d10
      punct
Packit b89d10
      space    \t, \n, \v, \f, \r, \x20
Packit b89d10
      upper
Packit b89d10
      xdigit   0-9, a-f, A-F
Packit b89d10
      word     英数字, "_" および 多バイト文字
Packit b89d10
Packit b89d10
    Unicodeの場合:
Packit b89d10
Packit b89d10
      alnum    Letter | Mark | Decimal_Number
Packit b89d10
      alpha    Letter | Mark
Packit b89d10
      ascii    0000 - 007F
Packit b89d10
      blank    Space_Separator | 0009
Packit b89d10
      cntrl    Control | Format | Unassigned | Private_Use | Surrogate
Packit b89d10
      digit    Decimal_Number
Packit b89d10
      graph    [[:^space:]] && ^Control && ^Unassigned && ^Surrogate
Packit b89d10
      lower    Lowercase_Letter
Packit b89d10
      print    [[:graph:]] | [[:space:]]
Packit b89d10
      punct    Connector_Punctuation | Dash_Punctuation | Close_Punctuation |
Packit b89d10
               Final_Punctuation | Initial_Punctuation | Other_Punctuation |
Packit b89d10
               Open_Punctuation
Packit b89d10
      space    Space_Separator | Line_Separator | Paragraph_Separator |
Packit b89d10
               U+0009 | U+000A | U+000B | U+000C | U+000D | U+0085
Packit b89d10
      upper    Uppercase_Letter
Packit b89d10
      xdigit   U+0030 - U+0039 | U+0041 - U+0046 | U+0061 - U+0066
Packit b89d10
               (0-9, a-f, A-F)
Packit b89d10
      word     Letter | Mark | Decimal_Number | Connector_Punctuation
Packit b89d10
Packit b89d10
Packit b89d10
Packit b89d10
7. 拡張式集合
Packit b89d10
Packit b89d10
  (?#...)           注釈
Packit b89d10
  (?imxWDSP-imxWDSP)      孤立オプション
Packit b89d10
                            i: 大文字小文字照合
Packit b89d10
                            m: 複数行
Packit b89d10
                            x: 拡張形式
Packit b89d10
                            W: wordがASCIIのみ (\w, \p{Word}, [[:word:]])
Packit b89d10
                               word境界がASCIIのみ (\b)
Packit b89d10
                            D: digitがASCIIのみ (\d, \p{Digit}, [[:digit:]])
Packit b89d10
                            S: spaceがASCIIのみ (\s, \p{Space}, [[:space:]])
Packit b89d10
                            P: POSIXプロパティがASCIIのみ (W,D,Sを全て含んでいる)
Packit b89d10
                               (alnum, alpha, blank, cntrl, digit, graph,
Packit b89d10
                                lower, print, punct, space, upper, xdigit, word)
Packit b89d10
Packit b89d10
  (?imxWDSP-imxWDSP:式)   式オプション
Packit b89d10
Packit b89d10
  (式)              捕獲式集合
Packit b89d10
  (?:式)            非捕獲式集合
Packit b89d10
Packit b89d10
  (?=式)            先読み
Packit b89d10
  (?!式)            否定先読み
Packit b89d10
  (?<=式)           戻り読み
Packit b89d10
  (?
Packit b89d10
Packit b89d10
                    戻り読みの式は固定文字長でなければならない。
Packit b89d10
                    しかし、最上位の選択子だけは異なった文字長が許される。
Packit b89d10
                    例. (?<=a|bc) は許可. (?<=aaa(?:b|cd)) は不許可
Packit b89d10
Packit b89d10
                    否定戻り読みでは、捕獲式集合は許されないが、
Packit b89d10
                    非捕獲式集合は許される。
Packit b89d10
Packit b89d10
  (?>式)            原子的式集合
Packit b89d10
                    式全体を通過したとき、式の中での後退再試行を行なわない
Packit b89d10
Packit b89d10
  (?<name>式), (?'name'式)
Packit b89d10
                    名前付き捕獲式集合
Packit b89d10
                    式集合に名前を割り当てる(定義する)。
Packit b89d10
                    (名前は単語構成文字でなければならない。)
Packit b89d10
Packit b89d10
                    名前だけでなく、捕獲式集合と同様に番号も割り当てられる。
Packit b89d10
                    番号指定が禁止されていない状態 (10. 捕獲式集合 を参照)
Packit b89d10
                    のときは、名前を使わないで番号でも参照できる。
Packit b89d10
Packit b89d10
                    複数の式集合に同じ名前を与えることは許されている。
Packit b89d10
                    この場合には、この名前を使用した後方参照は可能であるが、
Packit b89d10
                    部分式呼出しはできない。
Packit b89d10
Packit b89d10
Packit b89d10
  <呼び出し>
Packit b89d10
Packit b89d10
  * 内容の呼び出し
Packit b89d10
  (?{...contents...})           前進中のみの呼び出し
Packit b89d10
  (?{...contents...}D)          Dは方向指定文字
Packit b89d10
                                D = 'X': 前進中および後退中
Packit b89d10
                                    '<': 後退中のみ
Packit b89d10
                                    '>': 前進中のみ
Packit b89d10
  (?{...contents...}[tag])      名札付き
Packit b89d10
  (?{...contents...}[tag]D)
Packit b89d10
Packit b89d10
                              * エスケープ文字はcontentsの中で何の機能も持たない
Packit b89d10
                              * contentsは、'{'文字で始まってはならない
Packit b89d10
Packit b89d10
  (?{{{...contents...}}})     contentsの中のn個連続の'}'は、(n+1)個連続の{{{...}}}
Packit b89d10
                              の中で許される
Packit b89d10
Packit b89d10
    tagに許される文字: _ A-Z a-z 0-9 (* 最初の文字: _ A-Z a-z)
Packit b89d10
Packit b89d10
Packit b89d10
  * 名前の呼び出し
Packit b89d10
  (*name)
Packit b89d10
  (*name{args...})         引数付き
Packit b89d10
  (*name[tag])             名札付き
Packit b89d10
  (*name[tag]{args...})
Packit b89d10
Packit b89d10
    nameに許される文字: _ A-Z a-z 0-9 (* 最初の文字: _ A-Z a-z)
Packit b89d10
    tag に許される文字: _ A-Z a-z 0-9 (* 最初の文字: _ A-Z a-z)
Packit b89d10
Packit b89d10
Packit b89d10
Packit b89d10
  <不在機能群>
Packit b89d10
Packit b89d10
  (?~不在式)        不在繰り返し  (*原案 田中哲)
Packit b89d10
                    これは .*(より正確には\O*)のように動作するが、<不在式>に
Packit b89d10
                    適合する文字列を含まない範囲に制限される。
Packit b89d10
                    これは(?~|不在式|\O*)の省略表記である。
Packit b89d10
Packit b89d10
  (?~|不在式|式)    不在式  (* 原作)
Packit b89d10
                    これは<式>のように動作するが、<不在式>に適合する文字列を
Packit b89d10
                    含まない範囲に制限される。
Packit b89d10
Packit b89d10
                    例 (?~|345|\d*)  "12345678"  ==> "12", "1", ""
Packit b89d10
Packit b89d10
  (?~|不在式)       不在停止 (* 原作)
Packit b89d10
                    この演算子を通過した後は、対象文字列の適合範囲が
Packit b89d10
                    <不在式>に適合する文字列を含まない範囲に制限される。
Packit b89d10
Packit b89d10
  (?~|)             範囲消去
Packit b89d10
                    不在停止の効果を消して、それ以前の状態にする。
Packit b89d10
Packit b89d10
     * 不在機能の入れ子には対応しておらず、その場合の挙動は不定とする。
Packit b89d10
Packit b89d10
Packit b89d10
Packit b89d10
  <条件文>
Packit b89d10
Packit b89d10
  (?(条件式)成功式|失敗式)    条件式が成功すれば成功式、失敗すれば失敗式を実行する
Packit b89d10
                             この機能の存在理由は、成功式が失敗しても失敗式には
Packit b89d10
                             行かないこと。これは他の正規表現で書くことができない。
Packit b89d10
                             もうひとつは、条件式が後方参照の番号/名前のとき、
Packit b89d10
                             後方参照値の有効性を調べる(文字列と照合はしない)
Packit b89d10
                             意味になる。
Packit b89d10
Packit b89d10
  (?(条件式)成功式)           条件式が成功すれば成功式を実行する
Packit b89d10
                             (条件式が通常の式のときには、この構文は不必要だが
Packit b89d10
                              今のところエラーにはしない。)
Packit b89d10
Packit b89d10
Packit b89d10
                    条件式は後方参照の番号/名前または普通の式を使用できる。
Packit b89d10
                    条件式が後方参照の場合、成功式と失敗式の両方を省略可能であり、
Packit b89d10
                    この場合、後方参照値有効性を調べる(成功/失敗)機能のみになる。
Packit b89d10
Packit b89d10
  [後方参照値有効性確認器]  (* 原作)
Packit b89d10
    (?(n)), (?(-n)), (?(+n)), (?(n+level)) ...
Packit b89d10
    (?(<n>)), (?('-n')), (?(<+n>)) ...
Packit b89d10
    (?(<name>)), (?('name')), (?(<name+level>)) ...
Packit b89d10
Packit b89d10
Packit b89d10
Packit b89d10
8. 後方参照
Packit b89d10
Packit b89d10
  \n          番号指定参照     (n >= 1)
Packit b89d10
  \k<n>       番号指定参照     (n >= 1)
Packit b89d10
  \k'n'       番号指定参照     (n >= 1)
Packit b89d10
  \k<-n>      相対番号指定参照 (n >= 1)
Packit b89d10
  \k'-n'      相対番号指定参照 (n >= 1)
Packit b89d10
  \k<+n>      相対番号指定参照 (n >= 1)
Packit b89d10
  \k'+n'      相対番号指定参照 (n >= 1)
Packit b89d10
  \k<name>    名前指定参照
Packit b89d10
  \k'name'    名前指定参照
Packit b89d10
Packit b89d10
  名前指定参照で、その名前が複数の式集合で多重定義されている場合には、
Packit b89d10
  番号の大きい式集合から優先的に参照される。
Packit b89d10
  (マッチしないときには番号の小さい式集合が参照される)
Packit b89d10
Packit b89d10
  ※ 番号指定参照は、名前付き捕獲式集合が定義され、
Packit b89d10
     かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、
Packit b89d10
     禁止される。(10. 捕獲式集合 を参照)
Packit b89d10
Packit b89d10
Packit b89d10
  ネストレベル付き後方参照
Packit b89d10
Packit b89d10
    level: 0, 1, 2, ...
Packit b89d10
Packit b89d10
    \k<n+level>     (n >= 1)
Packit b89d10
    \k<n-level>     (n >= 1)
Packit b89d10
    \k'n+level'     (n >= 1)
Packit b89d10
    \k'n-level'     (n >= 1)
Packit b89d10
Packit b89d10
    \k<name+level>
Packit b89d10
    \k<name-level>
Packit b89d10
    \k'name+level'
Packit b89d10
    \k'name-level'
Packit b89d10
Packit b89d10
    後方参照の位置から相対的な部分式呼出しネストレベルを指定して、そのレベルでの
Packit b89d10
    捕獲値を参照する。
Packit b89d10
Packit b89d10
    例-1.
Packit b89d10
Packit b89d10
      /\A(?|.|(?:(?.)\g\k<b+0>))\z/.match("reer")
Packit b89d10
Packit b89d10
    例-2.
Packit b89d10
Packit b89d10
      r = Regexp.compile(<<'__REGEXP__'.strip, Regexp::EXTENDED)
Packit b89d10
      (?<element> \g<stag> \g<content>* \g<etag> ){0}
Packit b89d10
      (?<stag> < \g<name> \s* > ){0}
Packit b89d10
      (?<name> [a-zA-Z_:]+ ){0}
Packit b89d10
      (?<content> [^<&]+ (\g<element> | [^<&]+)* ){0}
Packit b89d10
      (?<etag> </ \k<name+1> >){0}
Packit b89d10
      \g<element>
Packit b89d10
      __REGEXP__
Packit b89d10
Packit b89d10
      p r.match('<foo>f<bar>bbb</bar>f</foo>').captures
Packit b89d10
Packit b89d10
Packit b89d10
Packit b89d10
9. 部分式呼出し ("田中哲スペシャル")   (* 原作)
Packit b89d10
Packit b89d10
  \g<name>    名前指定呼出し
Packit b89d10
  \g'name'    名前指定呼出し
Packit b89d10
  \g<n>       番号指定呼出し    (n >= 1)
Packit b89d10
  \g'n'       番号指定呼出し    (n >= 1)
Packit b89d10
  \g<0>       番号指定呼出し(全体呼び出し)
Packit b89d10
  \g'0'       番号指定呼出し(全体呼び出し)
Packit b89d10
  \g<-n>      相対番号指定呼出し (n >= 1)
Packit b89d10
  \g'-n'      相対番号指定呼出し (n >= 1)
Packit b89d10
  \g<+n>      相対番号指定呼出し (n >= 1)
Packit b89d10
  \g'+n'      相対番号指定呼出し (n >= 1)
Packit b89d10
Packit b89d10
  ※ 最左位置での再帰呼出しは禁止される。
Packit b89d10
     例. (?<name>a|\g<name>b)   => error
Packit b89d10
         (?<name>a|b\g<name>c)  => OK
Packit b89d10
Packit b89d10
  ※ 番号指定呼出しは、名前付き捕獲式集合が定義され、
Packit b89d10
     かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、
Packit b89d10
     禁止される。 (10. 捕獲式集合 を参照)
Packit b89d10
Packit b89d10
  ※ 呼び出された式集合のオプション状態が呼出し側のオプション状態と異なっている
Packit b89d10
     とき、呼び出された側のオプション状態が有効である。
Packit b89d10
Packit b89d10
     例. (?-i:\g<name>)(?i:(?<name>a)){0} は "A" に照合成功する。
Packit b89d10
Packit b89d10
Packit b89d10
10. 捕獲式集合
Packit b89d10
Packit b89d10
  捕獲式集合(...)は、以下の条件に応じて振舞が変化する。
Packit b89d10
  (名前付き捕獲式集合は変化しない)
Packit b89d10
Packit b89d10
  case 1. /.../     (名前付き捕獲式集合は不使用、オプションなし)
Packit b89d10
Packit b89d10
     (...) は、捕獲式集合として扱われる。
Packit b89d10
Packit b89d10
  case 2. /.../g    (名前付き捕獲式集合は不使用、オプション 'g'を指定)
Packit b89d10
Packit b89d10
     (...) は、非捕獲式集合として扱われる。
Packit b89d10
Packit b89d10
  case 3. /..(?<name>..)../   (名前付き捕獲式集合は使用、オプションなし)
Packit b89d10
Packit b89d10
     (...) は、非捕獲式集合として扱われる。
Packit b89d10
     番号指定参照/呼び出しは不許可。
Packit b89d10
Packit b89d10
  case 4. /..(?<name>..)../G  (名前付き捕獲式集合は使用、オプション 'G'を指定)
Packit b89d10
Packit b89d10
     (...) は、捕獲式集合として扱われる。
Packit b89d10
     番号指定参照/呼び出しは許可。
Packit b89d10
Packit b89d10
  但し
Packit b89d10
    g: ONIG_OPTION_DONT_CAPTURE_GROUP
Packit b89d10
    G: ONIG_OPTION_CAPTURE_GROUP
Packit b89d10
    ('g'と'G'オプションは、ruby-dev MLで議論された。)
Packit b89d10
Packit b89d10
  これらの振舞の意味は、
Packit b89d10
  名前付き捕獲と名前無し捕獲を同時に使用する必然性のある場面は少ないであろう
Packit b89d10
  という理由から考えられたものである。
Packit b89d10
Packit b89d10
Packit b89d10
-----------------------------
Packit b89d10
補記 1. 文法依存オプション
Packit b89d10
Packit b89d10
   + ONIG_SYNTAX_ONIGURUMA
Packit b89d10
     (?m): 終止符記号(.)は改行と照合成功
Packit b89d10
Packit b89d10
   + ONIG_SYNTAX_PERL と ONIG_SYNTAX_JAVA
Packit b89d10
     (?s): 終止符記号(.)は改行と照合成功
Packit b89d10
     (?m): ^ は改行の直後に照合する、$ は改行の直前に照合する
Packit b89d10
Packit b89d10
Packit b89d10
補記 2. 独自拡張機能
Packit b89d10
Packit b89d10
   + 16進数数字、非16進数字  \h, \H
Packit b89d10
   + 名前付き捕獲式集合      (?<name>...), (?'name'...)
Packit b89d10
   + 名前指定後方参照        \k<name>
Packit b89d10
   + 部分式呼出し            \g<name>, \g<group-num>
Packit b89d10
Packit b89d10
Packit b89d10
補記 3. Perl 5.8.0と比較して存在しない機能
Packit b89d10
Packit b89d10
   + \N{name}
Packit b89d10
   + \l,\u,\L,\U,\C
Packit b89d10
   + (?{code})
Packit b89d10
   + (??{code})
Packit b89d10
Packit b89d10
   * \Q...\E
Packit b89d10
     但しONIG_SYNTAX_PERLとONIG_SYNTAX_JAVAでは有効
Packit b89d10
Packit b89d10
Packit b89d10
補記 4. Ruby 1.8 の日本語化 GNU regex(version 0.12)との違い
Packit b89d10
Packit b89d10
   + 文字Property機能追加 (\p{property}, \P{Property})
Packit b89d10
   + 16進数字タイプ追加 (\h, \H)
Packit b89d10
   + 戻り読み機能を追加
Packit b89d10
   + 強欲な繰り返し指定子を追加 (?+, *+, ++)
Packit b89d10
   + 文字集合の中の演算子を追加 ([...], &&)
Packit b89d10
     ('[' は、文字集合の中で通常の文字として使用するときには
Packit b89d10
      退避修飾しなければならない)
Packit b89d10
   + 名前付き捕獲式集合と、部分式呼出し機能追加
Packit b89d10
   + 多バイト文字コードが指定されているとき、
Packit b89d10
     文字集合の中で八進数または十六進数表現の連続は、多バイト符号で表現された
Packit b89d10
     一個の文字と解釈される
Packit b89d10
     (例. [\xa1\xa2], [\xa1\xa7-\xa4\xa1])
Packit b89d10
   + 文字集合の中で、一バイト文字と多バイト文字の範囲指定は許される。
Packit b89d10
     ex. /[a-あ]/
Packit b89d10
   + 孤立オプションの有効範囲は、その孤立オプションを含んでいる式集合の
Packit b89d10
     終わりまでである
Packit b89d10
     例. (?:(?i)a|b) は (?:(?i:a|b)) と解釈される、(?:(?i:a)|b)ではない
Packit b89d10
   + 孤立オプションはその前の式に対して透過的ではない
Packit b89d10
     例. /a(?i)*/ は文法エラーとなる
Packit b89d10
   + 不完全な繰り返し範囲指定子は通常の文字列として許可される
Packit b89d10
     例. /{/, /({)/, /a{2,3/
Packit b89d10
   + 否定的POSIXブラケット [:^xxxx:] を追加
Packit b89d10
   + POSIXブラケット [:ascii:] を追加
Packit b89d10
   + 先読みの繰り返しは不許可
Packit b89d10
     例. /(?=a)*/, /(?!b){5}/
Packit b89d10
   + 数値で指定された文字に対しても、大文字小文字照合オプションは有効
Packit b89d10
     例. /\x61/i =~ "A"
Packit b89d10
   + 繰り返し回数指定で、最低回数の省略(0回)ができる
Packit b89d10
     /a{,n}/ == /a{0,n}/
Packit b89d10
     最低回数と最大回数の同時省略は許されない。(/a{,}/)
Packit b89d10
   + /a{n}?/は無欲な演算子ではない。
Packit b89d10
     /a{n}?/ == /(?:a{n})?/
Packit b89d10
   + 無効な後方参照をチェックしてエラーにする。
Packit b89d10
     /\1/, /(a)\2/
Packit b89d10
   + 無限繰り返しの中で、長さ零での照合成功は繰り返しを中断させるが、
Packit b89d10
     このとき、中断すべきかどうかの判定として、捕獲式集合の捕獲状態の
Packit b89d10
     変化まで考慮している
Packit b89d10
     /(?:()|())*\1\2/ =~ ""
Packit b89d10
     /(?:\1a|())*/ =~ "a"
Packit b89d10
Packit b89d10
Packit b89d10
Packit b89d10
補記 5. 実装されているが、既定値では有効にしていない機能
Packit b89d10
Packit b89d10
   + 捕獲履歴参照
Packit b89d10
Packit b89d10
     (?@...) と (?@<name>...)
Packit b89d10
Packit b89d10
     例. /(?@a)*/.match("aaa") ==> [<0-1>, <1-2>, <2-3>]
Packit b89d10
Packit b89d10
     使用方法は、sample/listcap.cを参照
Packit b89d10
Packit b89d10
     有効にしていない理由は、どの程度役に立つかはっきりしないため。
Packit b89d10
Packit b89d10
Packit b89d10
補記 6. 問題点
Packit b89d10
Packit b89d10
   + エンコーディングバイト値が適正な価かどうかのチェックは行なっていない。
Packit b89d10
Packit b89d10
     例: UTF-8
Packit b89d10
Packit b89d10
     * 先頭バイトとして不正なバイトを一文字とみなす
Packit b89d10
       /./u =~ "\xa3"
Packit b89d10
Packit b89d10
     * 不完全なバイトシーケンスのチェックをしない
Packit b89d10
      /\w+/u =~ "a\xf3\x8ec"
Packit b89d10
Packit b89d10
     これを調べることは可能ではあるが、遅くなるので行なわない。
Packit b89d10
Packit b89d10
     文字列として、そのようなバイト列を指定した場合の動作は保証しない。
Packit b89d10
Packit b89d10
終り