TITLE : Manpage of REGEX Original REGEX -------------------------------------------------------------------------------- 名前 regex - POSIX 1003.2 正規表現 説明 正規表現 (Regular expression: RE) は POSIX 1003.2 で定義されており、二 つの形式 がある。新しい正規表現 (modern RE) と古い正規表現 (obsolete RE) である。新しい正 規表現はだいたい egrep のものと同じで、 1003.2 では「拡張」正規表現 (``extended' ' RE) と呼ば れている。古い正規表現はだいたい ed <../../GNU_ed/man1/ed.1.html> (1) のものと同じで、 1003.2 では「基本」正規表現 (``basic'' RE) である。古 い正 規表現は、古いプログラムとの互換性を保つためのものである。これにつ いては最後に 議論する。 1003.2 では、正規表現の文法や記号の一部が、未定義のまま残されている。 `†' は、このような意味で、他の 1003.2 の実装と完全には互換 でないかも知れない部 分である。 (新しい) 正規表現は一つ以上† の空白でない 枝 (branch) からなる。枝 どうしは `|' で区切られる。正規表現は、枝のどれかにマッチ (match) した ものにマッチする。 枝は一つ以上の文節 (piece) が結合されたものである。枝は第一の文節がマッ チし、続 いて第二の文節がマッチし、... したものにマッチする。 文節はアトム (atom) からなる。ただしアトムの後には一つ† の `*', `+', `?' あるい は 繰り返し指定 (bound) が続くこともある。 `*' が後置されたアトムは、マッチした アトムの 0 個以上の並びにマッチする。 `+' が後置されたアトムは、マッチしたアトム の 1 個以上の並びにマッチする。 `?' が後置されたアトムは、マッチしたアトムの 0 個または 1 個にマッチする。 繰り返し指定とは `{' に続いて、符号なし 10 進整数、 `,'、もう一つ の 10 進整数、 `}' を並べたものである。 `,' と二つめの 10 進整数 は省略できる。二つめの 10 進整 数だけを省略することもできる (最後の `}' は省略できない)。整数は 0 以上 RE_DUP_M AX (255†) 以下の間で指定できる。 二つ指定する場合には、最初の数値は後の数値を越 えてはならない。 整数 i だけからなる繰り返し指定を後置されたアトムは、アトムをぴ っ たり i 個だけ並べたものにマッチする。 整数 i とコンマが指定された繰り返し指定 を後置されたアトムは、アト ムを i個以上並べたものにマッチする。 整数 i と j が指 定された繰り返し指定を後置されたアトムは、 アトムを i個以上 j 個以下だけ並べたも のにマッチする。 アトムの種類は以下の通り。 `()' に囲まれた正規表現 (その正規表現がマッ チする文 字列にマッチする)、 中身が空の `()' (null 文字列にマッチする)†、 ブラケット表現 (bracket expression :後述)、 `^' (行頭の空白文字にマッチする)、 `$' (行末の空白 文字にマッチする)、 `\' に `^.[$()|*+?{\' のいずれか一文 字を後置したもの (通常 の文字として扱われ、その文字にマッチする)、 `\' にそれ以外の文字を後置したもの† (`\' がない場合と同じように、その文 字にマッチする†)、特に意味を持たない文字一 つ (その文字にマッチする)。 `{' は数字以外の文字が後置されると通常の文字として扱 われ、繰り返し指定 の始まりとはされない†。 `\' で終わる正規表現は不正なものとみ なされる。 ブラケット表現は `[]' によって閉じられた文字のリストである。これ は通常リスト中 に存在している文字にマッチする。 (例外あり、後述。) リス トが `^' で始まると、ブ ラケット表現はリストに存在していない 文字一つにマッチする。 (例外あり、後述。) リスト中の二つの文字が `-' で区切られている場合は、これは、照合順序 (collating s equence) で その二つの文字に挟まれる、すべての文字の並びを短縮したものとみなされ る (両端含む)。例えば `[0-9]' は ASCII では 10 進の数字 (digit) のいずれ かにマ ッチする。二つの領域指定が端点を共有してはならない†。つまり `a-c-e' のようなも のは不正である。領域指定は照合順序に強く依存する。し たがって、移植性の高いプロ グラムを作る場合は、領域指定には頼らないほう が良いだろう。 (訳注) 照合順序 (collating sequence) というのは、国際化 (Internationalization) に関連した用語です。アルファベット順に単語を並 べる際には、言語によって並べる基 準が異なります。照合順序は、その差異を 吸収するための仕組みです。 例えば、スペイン語では ch という文字並びを特別扱いするため、アルファベッ ト順が a, b, c, ch, d, e, ... の順になるそうです。このようなシーケンス のことを collati ng sequence と言います。このとき `ch' という文字並びは、 単語整列の際にあたかも 「一文字」のように扱われます。ここで、 順序付けを行う際に最小の単位となる、`a'、 `b' の文字や `ch' のような特別な文字並びなど、照合順序の要素のことを collating e lement と言います。collating sequence は、文字単位ではなく collating element を 単位として定義されます。 (訳注終) 文字 `]' そのものをリストに入れたい場合は、最初の文字として指定すれば 良い (`^' の後に続けるのでも良い)。文字 `-' そのものをリストに入れたい 場合は、最初か最後 の文字とすれば良い。あるいは領域指定の終端文字として 指定しても良い。 `-' を領域 指定の先頭文字に指定するには、 `[.' と `.]' で囲って、照合順序の要素 (collating element: 後述) にすれば良い。他の 特殊文字 (`\' も含む) は、ブラケット表現の内部 ではすべて通常の文字と して扱われる。 ブラケット表現の内部では、 `[.' と `.]' に囲われた照合順序の要素は、そ の要素に 対応する文字並びを表す。 (「照合順序の要素」とは以下のいずれか である。 1)文字、 2) 単一文字のように扱われる複数文字のシーケンス、 3) 1),2) いずれかに対応する照 合順序上の名前。)この繰り返しは、ブラケッ ト表現のリストにおける単一の要素とな る。上記 2) の、「複数文字からな る照合順序要素」を含むブラケット表現は、したが って一文字以上にマッチ することがある。 例えば、もし照合順序が `ch' という要素を 含んでいる場合には、正規表現 `[[.ch.]]*c' は `chchcc' の最初の 5 文字にマッチす る。 ブラケット表現の内部では、 `[=' と `=]' に囲まれた照合順序の要素は、等 価クラス (equivalence class) となる。これは、その要素と等価な要素すべ てからなる文字シー ケンス (自身も含む) を表す。 (他に等価な要素がなけれ ば、取り扱いは `[.' と `.]' で囲まれている場合と同じである。) 例えば、 o と ou が等価クラスのメンバーであれ ば、`[[=o=]]', `[[=ou=]]', `[o[.ou.]]' はすべて同じ意味になる。等価クラスは領域 指定の端点にはなれ ない†。 ブラケット表現の内部では、 `[:' と `:]' で囲われた文字クラス (character class) はそのクラスに属するすべての文字のリストを表す。 標準で用意されている文字クラス の名前は以下の通り: alnum digitpunct alpha graphspace blank lowerupper cntrl printxdigit これらは ctype(3) で定義されている文字クラスを表している。ロケール (locale) によ って、こ れら以外のクラスが定義されることもある。文字クラスは領域指定の端点には なれない。 ブラケット表現には、特殊な意味を持つものが二つ存在する†。ブラケット表現 `[[:<:] ]' はワード (word) 先頭のヌル文字列に、 `[[:>:]]' はワード末尾のヌル文字 列にそ れぞれマッチする。ワードとはワード文字の並びであり、ワード文字が 前置も後置もさ れていないものである。ワード文字は alnum 文字 ( ctype(3) で定義されている) およ びアンダースコア `_' である。これは拡張記法であ り、 POSIX 1003.2 に反してはいな いが、定義もされていない。他のシステム と互換性を確保したいソフトウェアでは、気 を付けて用いるようにすること。 正規表現が、与えられた文字列のうち、複数の部分文字列 (substring) にマッ チできる ような場合には、与えられた文字列の、もっとも先頭の近くから始ま るものにマッチす る。その位置から始まり、正規表現がマッチできる部分文字 列が複数ある場合には、最 長のものにマッチする。部分正規表現 (subexpression) も最も長い部分文字列にマッチ する。ただし、全体のマッチ が最長であるように、という条件が優先される。正規表現 の中で先に現れる部 分正規表現は、後に現れるものより優先される。ただし、より高位 の部分正規 表現は、それを構成する低位の部分正規表現よりも優先されることに注意す る こと。 マッチ長は照合順序の要素ではなく、文字数を単位としてカウントされる。 null 文字列 は、全くマッチしなかった場合よりも長いとみなされる。例えば `bb*' は `abbbc' のま ん中の 3 文字にマッチする。 `(wee|week)(knights|nights)' は `weeknights' の全体 にマッチする。 `(.*).*' を `abc' にマッチさせると、括弧の内部の部分正規表現が 3 文字 すべてにマッチする。 `(a*)*' を `bc' にマッチさせると、正規表現全体も、 括 弧で括られた部分正規表現も null 文字列にマッチする。 マッチが大文字・小文字を無視するように指定されると、アルファベット全体 から大小 文字のの区別が無くなったかのような効果となる。大文字・小文字を 持つアルファベッ トがブラケット表現の外部で通常の文字として現れると、こ れは実効的に、大小両方の 文字のブラケット表現のように変換される。すなわ ち `x' は `[xX]' となる。ブラケッ ト表現の内部に現れると、大文字なら小 文字が、小文字なら大文字がそのブラケット表 現に加えられる。すなわち `[x]' は `[xX]' に、 `[^x]' は `[^xX]' となる。 正規表現の長さには特に制限はない†。ただし移植性を高くしたいプログラム では、 25 6 バイトより長い正規表現は実行しないようにするほうが良い。な ぜなら、そのような 正規表現を拒否し、しかも POSIX 互換を保つような実装 が可能だからである。 古い (``基本'') 正規表現は、いくつかの点において異なる。 `|', `+', `?' は通常の 文字となる。対応する機能は存在しない。繰り返し指定の区切りは `\{' および `\}' と なる。 `{' と `}' は、単独では通常の文字として扱 われる。 部分正規表現をネストす る括弧は `\(' および `\)' となり、 `(' と `)' は単 独では通常の文字となる。 `^' は正規表現の先頭か、括弧でくくられた部分 表現の先頭† を除いて通常の文字となる。 `$' は正規表現の末尾か、括弧で くくられた部分正規表現の末尾† を除いて通常の文字 となる。 `*' は、正規表現の 先頭か、括弧でくくられた部分文字列の先頭に置かれた場 合は通常の文字とな る (`^' が前置されていてもよい)。 最後に、アトムとして別のタ イプが存在する。後方参照 (back reference) である。 `\' の後に 0 でない 10 進数値 文字 d が続 くと、括弧でくくられた部分正規表現の d 番目にマッチした文字並びと同 じものにマッチする。 (部分正規表現の番号付けは、開き括弧 `(' の位置が左 のものか ら右のものへ向かってなされる。) したがって `e([bc]\)\1' は `bb' または `cc' には マッチするが、 `bc' にはマッチしない。 関連項目 regex <../man3/regex.3.html> (3) POSIX 1003.2, section 2.8 (Regular Expression Notation). バグ 正規表現が 2 種類あるのは格好悪い。 現在の 1003.2 規格においては、 ')' は、対応する `(' がない場合には通常 の文字と して扱われることになっている。しかしこれは、本来の意図とは異な る記述上のエラー であり、修正される可能性が高い。これに依存したコードは 使わないこと。 後方参照はひどく出来の悪い代物である。効率の良い実装をするのはとても難 しい。ま た定義があいまいである。 (`a\(\(b\)*\2\)*d' は `abbbd' にマッチすると思うか?) 使わないほうが良い。 1003.2 の規格では、case (大文字か小文字か) に依存しないマッチの記述が あいまいで ある。現在のところでは、「一つの case がすべての case を意味 する」という上記の 定義が正しい解釈であるというのが、実装者の間での共通 認識のようである。 ワード境界に関する文法定義が非常に醜い。 著者 このページは Henrry Spencer の regex パッケージから採録したものである。 -------------------------------------------------------------------------------- Index 名前 <#lbAB> 説明 <#lbAC> 関連項目 <#lbAD> バグ <#lbAE> 著者 <#lbAF> -------------------------------------------------------------------------------- This document was created by man2html <../../man/man1/man2html.1.html> , using the manual pages. Time: 10:27:24 GMT, November 02, 2000