演算子を使って正規表現を組み立てることができる。 続くセクションでは、GNUも使っている POSIXで定義されている正規表現演算子について記述する。 ほとんどの演算子は二つ以上のキャラクタを表す。 ある状況の下でキャラクタが表す演算子については セクション Regular Expression Syntaxを参照。
大部分の演算子は、二つの方法で表される。
一つはあるキャラクタ一文字が表すことであり、もうひとつは
キャラクタの前に`\'がついている場合である。
たとえば、`('と`\('はいずれもopen-group演算子を
表す。どちらが使われるかはシンタクスビットの設定によって決定し、
この例ではRE_NO_BK_PARENS
による。
なぜ、このようなことになっているのだろうか?
一部は歴史的な理由であり、その他はPOSIXの決定による。
ほとんどすべてのキャラクタは、リスト中(セクション List Operators ([
... ]
and [^
... ]
)を参照)では
その特殊な意味を失う。
この演算子はキャラクタそれ自身にマッチする。すべての通常キャラクタ (セクション Regular Expression Syntaxを参照) は、この演算子である。 たとえば`f'は常に通常キャラクタであり、したがって `f'は`f'という文字列にのみマッチする正規表現である。 特に、これは`ff'という文字列にはマッチしない。
.
)この演算子は印字の可、不可を問わず、あるキャラクタ一文字にマッチする。 ただし、以下の例外がある。
RE_DOT_NEWLINE
がセットされていないとき。
RE_DOT_NEWLINE
がセットされているとき。
`.'(ピリオド)がこの演算子を表す。たとえば、`a.b'は 任意の`a'で始まり`b'で終わる三文字の文字列にマッチする。
この演算子をあらわすキャラクタはない。ただ単純にbをaに 続けて書けばよい。結果として、それは最初にaがあり残りがbで あるような文字列にマッチする正規表現である。たとえば、`xy' (二つの、それ自身をあらわす演算子)は`xy'にマッチする。
繰り返し演算子は(演算子の)直前にある正規表現を繰り返す。
*
)この演算子は直前にある最小の正規表現を、パターンにマッチさせるために 可能な限り繰り返す(0回を含む)。 たとえば、`o*'は0個以上の`o'からなる文字列にマッチする。 この演算子は直前の、最小の正規表現を扱うので、 `fo*'は`o'の繰り返しを持っているが、`fo'の繰り返しではない。 したがって、`fo*'は`f'、`fo'、`foo'などにマッチする。
match-zero-or-more演算子は後置演算子であるので、直前に 正規表現がない場合には使うことができない。例を挙げると
このような事態がおきた場合、次の三種類の状態のいずれかになる。
RE_CONTEXT_INVALID_OPS
がセットされている場合、
その正規表現は不正なものとして扱われる。
RE_CONTEXT_INVALID_OPS
がセットされていないがRE_CONTEXT_INDEP_OPS
が
セットされている場合、`*'はmatch-zero-or-more演算子
(空の文字列に対して適用される)として扱われる。
match-zero-or-more演算子のマッチング手順は、まず最初に 直前にある最小の正規表現の繰り返しにできる限りマッチする。 そしてその後パターンの残りについてのマッチングを行う。
もしパターンの残りがマッチしなかった場合、バックトラックが発生し (必要があれば何度でも)、 パターン全体にマッチするか、マッチできないと分かるまで 一度に一文字づつ(マッチした文字列から)削りながらマッチングを 続ける。 たとえば、`ca*ar'を`caaar'にマッチさせようとしたとき、 まず最初に三つの`a'が全て正規表現の`a*'にマッチングしてしまう。 しかし、それでは正規表現の最後の`ar'が`r'にマッチできなくなる。 そこで、バックトラックしてマッチした部分の`a'を削る。 すると、(マッチングを試みる文字列の)残りの部分が`ar'とマッチする。
+
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'にはマッチしない。
?
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'にもマッチするが、それ以外には マッチしない。
{
... }
or \{
... \}
)
シンタクスビットのRE_INTERVALS
がセットされていると、
Regexはinterval expressionsを認識する。
これは、直前にある最小の正規表現の特定回数の繰り返しである。
シンタクスビットのRE_NO_BK_BRACES
がセットされていると
`{'がopen-interval 演算子、`}'が
close-interval 演算子 となる。このビットがセットされていない
場合には、それぞれ`\{' と `\}'になる。
`{'と`}'がそれぞれopen-interval演算子とclose-interval演算子 であるとして、
{count}
{min,}
{min, max}
interval expressionは以下の場合(それを含む正規表現がどうであるかに かかわらず)不正となる。
RE_DUP_MAX
の範囲外にある(`regex.h'で定義されているシンボル)。
interval expression が不正なものであり、かつRE_NO_BK_BRACES
が
セットされている場合、Regexはその式にある全てのキャラクタを
通常キャラクタであるとみなし、RE_NO_BK_BRACES
がセットされていない
場合には正規表現全体が不正なものであるとみなされる。
interval expression が正しいものであるが、対応する先行の正規表現がない
場合、シンタクスビットのRE_CONTEXT_INVALID_OPS
がセットされていれば
正規表現全体が不正なものとされ、RE_CONTEXT_INVALID_OPS
がセットされて
いなければRegexはすべてのキャラクタ(バックスラッシュは除いて。ここで
バックスラッシュは無視される)が全て通常キャラクタであるとみなす。
|
or \|
)
シンタクスビットのRE_LIMITED_OPS
がセットされていると
Regexはこの演算子を認識しない。RE_LIMITED_OPS
がセットされていない
場合、にはRE_NO_BK_VBAR
がセットされていれば`|'が、
セットされていなければ`\|'がこの演算子となる。
選択演算子は正規表現のうちある選択された一つにマッチする。 二つの正規表現aと bとの間に選択演算子を表すキャラクタを 置いたとすると、それは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'にマッチするのである。
[
... ]
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演算子に続く
キャラクタの並びをキャラクタクラス名とする。
-
)を参照)となる。
このほかのキャラクタは全て通常キャラクタである。たとえば`[.*]' は`.' と`*'にマッチする。
[:
... :]
)
シンタクスビットのRE_CHARACTER_CLASSES
がセットされていると
Regexはリスト中のキャラクタクラス式を認識する。
キャラクタクラス式は与えられたクラスに属するキャラクタ一文字に
マッチする。キャラクタクラスはopen-character-class 演算子
(`[:'で表される)とclose-character-class 演算子(`:]'で表される)
の間にキャラクタクラス名を置いて指定する。
キャラクタクラスには以下のものがある。
alnum
alpha
blank
cntrl
digit
graph
print
と同じだがスペースを含まない
lower
print
punct
space
upper
xdigit
0
--9
, a
--f
, A
--F
これらはCライブラリの`<ctype.h>'で定義されているものと同じである。
たとえば`[:alpha:]'はisalpha
に対応する。
Regexはリストの中にあるときのみ、キャラクタクラス式を認識する。
したがって`[[:alpha:]]'は任意の英字にマッチするが、
`[:alpha:]'はブラケットの外にある式であり、繰り返し演算子も
続いていないので、文字の並びそれ自身にマッチする。
-
)Regexはリスト中にある範囲式を認識する。 それは、現在注目しているシーケンスの二つの要素に挟まれたキャラクタである。 範囲式は二つのキャラクタの間に範囲演算子を置くことで組み立てられる。 (3) `-'が範囲演算子を表す。たとえば、`a-f'はリスト中にあると `a'から`f'までのキャラクタ全てを表す。
シンタクスビットのRE_NO_EMPTY_RANGES
がセットされていると、
範囲の終端が開始よりも小さい場合にその範囲(とそれを含む正規表現もまた)が
不正であるとみなされる。たとえば、`[z-a]'は不正である。
このビットがセットされていなければその様な範囲指定は空であるとみなされる。
`-'は範囲演算子であるので、`-'というキャラクタ自身を リストのアイテムとしたい場合には次のいずれかの手段を取らなければならない。
たとえば`[-a-z]'は英小文字か、ハイフンにマッチする (英語で、ASCIIの場合)。
(
... )
or \(
... \)
)グループはまた、部分式とも呼ばれ、 open-group演算子と任意の数の他の演算子、そしてclose-group演算子 で構成される。Regexはこのシーケンスを一つのユニットであるかのように 扱う。
したがって、グループを使うことによって次の事が可能になる。
|
or \|
)を参照)やくり返し演算子
(セクション Repetition Operatorsを参照)の引数を区切る。
シンタクスビットのRE_NO_BK_PARENS
がセットされているとき、
`('がopen-group演算子を、`)'がclose-group演算子を
表す。ビットがセットされていなければ`\('と`\)'が
それぞれ表す。
シンタクスビットのRE_UNMATCHED_RIGHT_PAREN_ORD
がセットされていて、
close-group演算子が対応するopen-group演算子を持たないとき、
Regexはそれを`)'とマッチするものであるとみなす。
シンタクスビットの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演算子を 表すものとする)
RE_DOT_NEWLINE
がセットされていないときはnewline-freeである)
マッチする。ここで、`(.*)'は最初の半分にマッチし、
`\1'は次の半分にマッチする。
後方参照を繰り返し演算子の引数として使うこともできる。 たとえば、`(a(b))\2*'は`a'の後に二個以上の`b'が 続くものにマッチする。同様に、`(a(b))\2{3}'は`abbbb'にマッチする。
先行するdigit-th番目の部分正規表現がない場合、 正規表現は不正なものとみなされる。
これらの演算子はパターンを文字列全体、あるいは行の 先頭か終端にだけマッチするように強制することのできる演算子である。
^
)この演算子は文字列の先頭、もしくは改行キャラクタの直後の空文字列に マッチする。したがって、これは行の先頭に対するanchorパターンであると いえる。
以下に挙げる場合に、`^'はこの演算子を表す(それ以外の場合は `^'は通常のキャラクタである)。
RE_CONTEXT_INDEP_ANCHORS
がセットされていて、
かつブラケット式の外にある。
(
... )
or \(
... \)
)を参照, and セクション The Alternation Operator (|
or \|
)を参照.
これらのルールは`^'を含んでいるような
ある正しいパターンがマッチしないということを意味する。
たとえば、RE_CONTEXT_INDEP_ANCHORS
がセットされているときの
`foo^bar'がその様なパターンである。
パターンバッファ(セクション GNU Pattern Buffersを参照)の
not_bol
フィールドがセットされている場合、
`^'は文字列の先頭にマッチしない。
これがどのようなときに有効なものであるかの説明は
セクション POSIX Matchingを参照。
パターンバッファのnewline_anchor
フィールドがセットされていると、
`^'は改行の直後にマッチしない。これは
行に分けて文字列をマッチさせるということを考慮しないときに便利だろう。
$
)この演算子は文字列の最後、もしくは文字列中の 改行の直前にある空文字列にマッチする。したがって、これは 行の最後に対するanchorパターンであると言える。
この演算子は常に`$'で表される。たとえば、`foo$'など。 これは`foo\nbar'の最初のキャラクタ三つにマッチする。
シンタクスビット及びパターンバッファのフィールドによる作用は `^'と同じなので前のセクションを参照のこと。 ("先頭"を"終端"に、"直後"を"直前"に読み替えること)