移動先 先頭, , , 末尾 セクション, 目次.

Common Operators

演算子を使って正規表現を組み立てることができる。 続くセクションでは、GNUも使っている POSIXで定義されている正規表現演算子について記述する。 ほとんどの演算子は二つ以上のキャラクタを表す。 ある状況の下でキャラクタが表す演算子については セクション Regular Expression Syntaxを参照。

大部分の演算子は、二つの方法で表される。 一つはあるキャラクタ一文字が表すことであり、もうひとつは キャラクタの前に`\'がついている場合である。 たとえば、`('`\('はいずれもopen-group演算子を 表す。どちらが使われるかはシンタクスビットの設定によって決定し、 この例ではRE_NO_BK_PARENSによる。 なぜ、このようなことになっているのだろうか? 一部は歴史的な理由であり、その他はPOSIXの決定による。

ほとんどすべてのキャラクタは、リスト中(セクション List Operators ([ ... ] and [^ ... ])を参照)では その特殊な意味を失う。

The Match-self Operator (ordinary character)

この演算子はキャラクタそれ自身にマッチする。すべての通常キャラクタ (セクション Regular Expression Syntaxを参照) は、この演算子である。 たとえば`f'は常に通常キャラクタであり、したがって `f'`f'という文字列にのみマッチする正規表現である。 特に、これは`ff'という文字列にはマッチしない

The Match-any-character Operator (.)

この演算子は印字の可、不可を問わず、あるキャラクタ一文字にマッチする。 ただし、以下の例外がある。

newline
シンタクスビットのRE_DOT_NEWLINEがセットされていないとき。
null
シンタクスビットのRE_DOT_NEWLINEがセットされているとき。

`.'(ピリオド)がこの演算子を表す。たとえば、`a.b'は 任意の`a'で始まり`b'で終わる三文字の文字列にマッチする。

The Concatenation Operator

この演算子をあらわすキャラクタはない。ただ単純にbaに 続けて書けばよい。結果として、それは最初にaがあり残りがbで あるような文字列にマッチする正規表現である。たとえば、`xy' (二つの、それ自身をあらわす演算子)は`xy'にマッチする。

Repetition Operators

繰り返し演算子は(演算子の)直前にある正規表現を繰り返す。

The Match-zero-or-more Operator (*)

この演算子は直前にある最小の正規表現を、パターンにマッチさせるために 可能な限り繰り返す(0回を含む)。 たとえば、`o*'は0個以上の`o'からなる文字列にマッチする。 この演算子は直前の、最小の正規表現を扱うので、 `fo*'`o'の繰り返しを持っているが、`fo'の繰り返しではない。 したがって、`fo*'`f'`fo'`foo'などにマッチする。

match-zero-or-more演算子は後置演算子であるので、直前に 正規表現がない場合には使うことができない。例を挙げると

このような事態がおきた場合、次の三種類の状態のいずれかになる。

  1. シンタクスビットのRE_CONTEXT_INVALID_OPSがセットされている場合、 その正規表現は不正なものとして扱われる。
  2. RE_CONTEXT_INVALID_OPSがセットされていないがRE_CONTEXT_INDEP_OPSが セットされている場合、`*'はmatch-zero-or-more演算子 (空の文字列に対して適用される)として扱われる。
  3. 上記のいずれでもない場合には`*'は普通のキャラクタである。

match-zero-or-more演算子のマッチング手順は、まず最初に 直前にある最小の正規表現の繰り返しにできる限りマッチする。 そしてその後パターンの残りについてのマッチングを行う。

もしパターンの残りがマッチしなかった場合、バックトラックが発生し (必要があれば何度でも)、 パターン全体にマッチするか、マッチできないと分かるまで 一度に一文字づつ(マッチした文字列から)削りながらマッチングを 続ける。 たとえば、`ca*ar'`caaar'にマッチさせようとしたとき、 まず最初に三つの`a'が全て正規表現の`a*'にマッチングしてしまう。 しかし、それでは正規表現の最後の`ar'`r'にマッチできなくなる。 そこで、バックトラックしてマッチした部分の`a'を削る。 すると、(マッチングを試みる文字列の)残りの部分が`ar'とマッチする。

The Match-one-or-more Operator (+ or \+)

シンタクスビットのRE_LIMITED_OPSがセットされている場合、 Regexはこの演算子を認識しない。 また、シンタクスビットのRE_BK_PLUS_QMがセットされていなければ `+'が、セットされていれば`\+'がこの演算子をあらわす。

この演算子はmatch-zero-or-more演算子と似ているが、違うのはこの演算子は 直前の正規表現の繰り返しが少なくとも一回あるという点である。 この演算に対するシンタクスビットの働き、Regexのバックトラックが どのようになされているかはセクション The Match-zero-or-more Operator (*)を参照。

たとえば`+'がmatch-one-or-more演算子であるときの`ca+r'`car'`caaaar'にはマッチするが、`cr'にはマッチしない。

The Match-zero-or-one Operator (? or \?)

シンタクスビットのRE_LIMITED_OPSがセットされていると Regexはこの演算子を認識しない。 また、(RE_LIMITED_OPSがセットされてなくて)RE_BK_PLUS_QMが セットされていないと `?'がこの演算子になり、セットされていないと`\?'がこの演算子になる

この演算子はmatch-zero-or-more演算子に似ているが、違うのは この演算子が直前の正規表現の高々一回の繰り返し。という点である。 この演算子がどのように作用し、どのシンタクスビットに影響されるか、 なたRegexがマッチング時に行うバックトラックについては セクション The Match-zero-or-more Operator (*)を参照。

たとえば`?' がmatch-zero-or-one演算子であるときには、 `ca?r'`car' にも `cr'にもマッチするが、それ以外には マッチしない。

Interval Operators ({ ... } or \{ ... \})

シンタクスビットのRE_INTERVALSがセットされていると、 Regexはinterval expressionsを認識する。 これは、直前にある最小の正規表現の特定回数の繰り返しである。

シンタクスビットのRE_NO_BK_BRACESがセットされていると `{'open-interval 演算子`}'close-interval 演算子 となる。このビットがセットされていない 場合には、それぞれ`\{'`\}'になる。

`{'`}'がそれぞれopen-interval演算子とclose-interval演算子 であるとして、

{count}
直前の正規表現のcount回の繰り返しにマッチする。
{min,}
直前の正規表現のmin回以上の繰り返しにマッチする。
{min, max}
直前の正規表現のmin 回以上 max回以下の繰り返しにマッチする

interval expressionは以下の場合(それを含む正規表現がどうであるかに かかわらず)不正となる。

interval expression が不正なものであり、かつRE_NO_BK_BRACESが セットされている場合、Regexはその式にある全てのキャラクタを 通常キャラクタであるとみなし、RE_NO_BK_BRACESがセットされていない 場合には正規表現全体が不正なものであるとみなされる。

interval expression が正しいものであるが、対応する先行の正規表現がない 場合、シンタクスビットのRE_CONTEXT_INVALID_OPSがセットされていれば 正規表現全体が不正なものとされ、RE_CONTEXT_INVALID_OPSがセットされて いなければRegexはすべてのキャラクタ(バックスラッシュは除いて。ここで バックスラッシュは無視される)が全て通常キャラクタであるとみなす。

The Alternation Operator (| or \|)

シンタクスビットのRE_LIMITED_OPSがセットされていると Regexはこの演算子を認識しない。RE_LIMITED_OPSがセットされていない 場合、にはRE_NO_BK_VBARがセットされていれば`|'が、 セットされていなければ`\|'がこの演算子となる。

選択演算子は正規表現のうちある選択された一つにマッチする。 二つの正規表現abとの間に選択演算子を表すキャラクタを 置いたとすると、それはaにマッチする文字列と bにマッチする文字列の和集合である。 たとえば、選択演算子が`|'であったとすると、 `foo|bar|quux'`foo'`bar'、あるいは`quux' にマッチする。

alternation演算子はそれを取り囲む中で可能な限り最大の 正規表現に対して働く(言い換えれば、この演算子は 正規表現演算子の中で最低の優先順位の演算子である)。 したがって、その引数を分割するためのただ一つの手段は グルーピングを使うということである。 たとえば、`('`)'がそれぞれopen-group演算子、 close-group演算子であったとすると、`fo(o|b)ar'`fooar'`fobar'のいずれかにマッチする (`foo|bar'`foo'`bar'にマッチする)。

マッチング動作では、通常すべての選択肢の中でできる限り長いものに対して マッチを試みる。 たとえば`(fooq|foo)*(qbarquux|bar)'`fooqbarquux'の マッチングを試みたときには 最初の組み合わせ("深さ優先")でできる限りマッチングを進める。 そしてそれはちょうど`fooqbar'にマッチするのである。

List Operators ([ ... ] and [^ ... ])

リストブラケット式ともいう)は、一つ以上のアイテムの集合 である。ここでいうアイテムとはキャラクタ、 キャラクタクラス式、あるいは範囲式である。シンタクスビットは リスト中に置くことのできるキャラクタの種類に影響を及ぼす。 ここで最後の二つのアイテムについて続くサブセクションで述べる。 空のリストは不正である。

マッチングリストはリストアイテム中にあるキャラクタ一文字と マッチする。マッチングリストを作るには、一つ以上のアイテムを open-matching-list演算子 (`['で表される)と close-list演算子 (`]'で表される)で囲んでやればよい。

たとえば、`[ab]'`a'`b'にマッチする。 `[ad]*'は空文字列、任意の順序で`a'`d'だけから 構成される文字列にマッチする。Regexは対応する`]'のない `['を不正な正規表現であるとみなす。

Nonmatching listはマッチングリストと似ているが、違うのは リストの中にないキャラクタ一文字とマッチするということである。 nonmatching listはopen-matching-list演算子の代りに open-nonmatching-list演算子 (`[^'で表される (2) )を最初に置けばよい。

たとえば、`[^ab]'`a'でもなく`b'でもない いずれかのキャラクタにマッチする。

パターンバッファ(セクション GNU Pattern Buffersを参照)のposix_newline フィールドがセットされていると、nonmatching listは改行にマッチしない。

大部分のキャラクタはリスト中では特殊な意味を(持っていても)失う。 リスト中で特殊な意味を持つキャラクタは以下の通り。

`]'
リストの終端。ただしリストの先頭にあるときにはアイテムとなる。 したがって、`]'というキャラクタをリストのアイテムとして扱いたい 場合には、一番最初にこれをおかねばならない。
`\'
シンタクスビットのRE_BACKSLASH_ESCAPE_IN_LISTSがセットされているときに 次のキャラクタをクォートする。
`[:'
シンタクスビットのRE_CHAR_CLASSESがセットされているとき open-character-class演算子となる(セクション Character Class Operators ([: ... :])を参照)。 この演算子の後にキャラクタクラスの式が続く。
`:]'
シンタクスビットのRE_CHAR_CLASSESがセットされているとき close-character-class演算子となる。open-character-class演算子に続く キャラクタの並びをキャラクタクラス名とする。
`-'
リスト中で、先頭でもなく終端でもなく、範囲の終端でもない ときに範囲演算子(セクション The Range Operator (-)を参照)となる。

このほかのキャラクタは全て通常キャラクタである。たとえば`[.*]'`.'`*'にマッチする。

Character Class Operators ([: ... :])

シンタクスビットのRE_CHARACTER_CLASSESがセットされていると Regexはリスト中のキャラクタクラス式を認識する。 キャラクタクラス式は与えられたクラスに属するキャラクタ一文字に マッチする。キャラクタクラスはopen-character-class 演算子 (`[:'で表される)とclose-character-class 演算子(`:]'で表される) の間にキャラクタクラス名を置いて指定する。 キャラクタクラスには以下のものがある。

alnum
英字又は数字
alpha
英字
blank
システムによるが、GNUではスペースかタブ
cntrl
制御文字(ASCIIコードでは、0177と040以下のコード)
digit
数字
graph
printと同じだがスペースを含まない
lower
英小文字
print
印字可能なキャラクタ(ASCIIコードではスペースからティルデ、 つまり040から0176まで)
punct
制御文字でも、英数字でもないキャラクタ
space
スペース、キャリッジリターン、改行、垂直タブと改頁
upper
英大文字
xdigit
16進文字。つまり0--9, a--f, A--F

これらはCライブラリの`<ctype.h>'で定義されているものと同じである。 たとえば`[:alpha:]'isalphaに対応する。 Regexはリストの中にあるときのみ、キャラクタクラス式を認識する。 したがって`[[:alpha:]]'は任意の英字にマッチするが、 `[:alpha:]'はブラケットの外にある式であり、繰り返し演算子も 続いていないので、文字の並びそれ自身にマッチする。

The Range Operator (-)

Regexはリスト中にある範囲式を認識する。 それは、現在注目しているシーケンスの二つの要素に挟まれたキャラクタである。 範囲式は二つのキャラクタの間に範囲演算子を置くことで組み立てられる。 (3) `-'が範囲演算子を表す。たとえば、`a-f'はリスト中にあると `a'から`f'までのキャラクタ全てを表す。

シンタクスビットのRE_NO_EMPTY_RANGESがセットされていると、 範囲の終端が開始よりも小さい場合にその範囲(とそれを含む正規表現もまた)が 不正であるとみなされる。たとえば、`[z-a]'は不正である。 このビットがセットされていなければその様な範囲指定は空であるとみなされる。

`-'は範囲演算子であるので、`-'というキャラクタ自身を リストのアイテムとしたい場合には次のいずれかの手段を取らなければならない。

たとえば`[-a-z]'は英小文字か、ハイフンにマッチする (英語で、ASCIIの場合)。

Grouping Operators (( ... ) or \( ... \))

グループはまた、部分式とも呼ばれ、 open-group演算子と任意の数の他の演算子、そしてclose-group演算子 で構成される。Regexはこのシーケンスを一つのユニットであるかのように 扱う。

したがって、グループを使うことによって次の事が可能になる。

シンタクスビットのRE_NO_BK_PARENSがセットされているとき、 `('がopen-group演算子を、`)'がclose-group演算子を 表す。ビットがセットされていなければ`\('`\)'が それぞれ表す。

シンタクスビットのRE_UNMATCHED_RIGHT_PAREN_ORDがセットされていて、 close-group演算子が対応するopen-group演算子を持たないとき、 Regexはそれを`)'とマッチするものであるとみなす。

The Back-reference Operator (\digit)

シンタクスビットのRE_NO_BK_REFがセットされていないときに Regexは後方参照を認識する。後方参照は先行する特定のグループにマッチする。 後方参照演算子は`\digit'で表され、正規表現の digit-th番目のグループの後の任意の位置で使うことができる (セクション Grouping Operators (( ... ) or \( ... \))を参照)。

digit`1' から `9'の間になければならない。 マッチングルーチンはグループを発見すると1から9までの番号をアサインする。 対応するグループのclose-group演算子の後で`\1'から`\9'の 一つを使うことによって、それが示す特定の部分文字列にマッチさせることが できる。

後方参照は以下の規則に従ってマッチングを行う (以下に挙げる例では`('がopen-group演算子、`)'がclose-group演算子、 `{'がopen-interval演算子、`}'がclose-interval演算子を 表すものとする)

後方参照を繰り返し演算子の引数として使うこともできる。 たとえば、`(a(b))\2*'`a'の後に二個以上の`b'が 続くものにマッチする。同様に、`(a(b))\2{3}'`abbbb'にマッチする。

先行するdigit-th番目の部分正規表現がない場合、 正規表現は不正なものとみなされる。

Anchoring Operators

これらの演算子はパターンを文字列全体、あるいは行の 先頭か終端にだけマッチするように強制することのできる演算子である。

The Match-beginning-of-line Operator (^)

この演算子は文字列の先頭、もしくは改行キャラクタの直後の空文字列に マッチする。したがって、これは行の先頭に対するanchorパターンであると いえる。

以下に挙げる場合に、`^'はこの演算子を表す(それ以外の場合は `^'は通常のキャラクタである)。

これらのルールは`^'を含んでいるような ある正しいパターンがマッチしないということを意味する。 たとえば、RE_CONTEXT_INDEP_ANCHORSがセットされているときの `foo^bar'がその様なパターンである。

パターンバッファ(セクション GNU Pattern Buffersを参照)の not_bolフィールドがセットされている場合、 `^'は文字列の先頭にマッチしない。 これがどのようなときに有効なものであるかの説明は セクション POSIX Matchingを参照。

パターンバッファのnewline_anchorフィールドがセットされていると、 `^'は改行の直後にマッチしない。これは 行に分けて文字列をマッチさせるということを考慮しないときに便利だろう。

The Match-end-of-line Operator ($)

この演算子は文字列の最後、もしくは文字列中の 改行の直前にある空文字列にマッチする。したがって、これは 行の最後に対するanchorパターンであると言える。

この演算子は常に`$'で表される。たとえば、`foo$'など。 これは`foo\nbar'の最初のキャラクタ三つにマッチする。

シンタクスビット及びパターンバッファのフィールドによる作用は `^'と同じなので前のセクションを参照のこと。 ("先頭"を"終端"に、"直後"を"直前"に読み替えること)


移動先 先頭, , , 末尾 セクション, 目次.