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

Regular Expression Syntax

キャラクタとはタイプすることのできるものである。演算子とは 正規表現中にあって一つ以上のキャラクタにマッチするものである。 演算子を使って正規表現を組み立てる。

大部分のキャラクタはそれ自身にマッチする演算子である。このようなキャラクタを ordinaryであると呼ぶ。一部のキャラクタはあらゆる場合、もしくは ある特定の場合に、演算子を表す。たとえば`.'は我々が match-any-character演算子(ほとんどすべてのキャラクタにマッチする) と呼ぶものを表している。 我々はこういったキャラクタをspecialである、という。 キャラクタが表す演算子を区別するのに二つの事柄がある。

  1. プログラムで指定した、Regexライブラリが認識する 正規表現シンタクス。
  2. 正規表現中のキャラクタの文脈

次のセクションでこの事の詳細を述べる。

Syntax Bits

正規表現のある特定のシンタクスにおいては、あるキャラクタは常に 特殊であり、べつのあるものは特定の場合に特殊であり、その他のものは 特殊にはならない。

正規表現をコンパイルしてパターンバッファを得る。 パターンバッファについての詳細は セクション GNU Pattern Buffersを参照と、セクション POSIX Pattern Buffersを参照を、 コンパイルについての詳細は セクション GNU Regular Expression Compilingを参照、 セクション POSIX Regular Expression Compilingを参照、 と セクション BSD Regular Expression Compilingを参照を参照のこと。

Regexはsyntaxフィールドの値をビットの集合であるとみなす。 これらのビットをシンタクスビットとして参照する。 ほとんどの場合、キャラクタが表す演算子に影響を及ぼす。 ここでセクション Common Operatorsを参照,セクション GNU Operatorsを参照, セクション GNU Emacs Operatorsを参照 で述べられる演算子の意味を記す。

以下にシンタクスビットをアルファベット順に挙げる。

RE_BACKSLASH_ESCAPE_IN_LISTS
このビットがセットされているとリスト(セクション List Operators ([ ... ] and [^ ... ])を参照)中の `\'はそれに続くキャラクタをクォート(特別な意味があればそれを 無効にする)する。このビットがセットされていなければ `\'はリスト中で通常のキャラクタになる。 (セクション The Backslash Characterを参照, for what `\' does outside of lists.)
RE_BK_PLUS_QM
このビットがセットされている場合、`\+'がmatch-one-or-more演算子を 表し、`\?'がmatch-zero-or-more演算子を表す。 ビットがセットされていなければ、`+'がmatch-one-or-more演算子を表し、 `?'がmatch-zero-or-more演算子を表す。 このビットはRE_LIMITED_OPSがセットされている場合には無意味である。
RE_CHAR_CLASSES
このビットがセットされていると、リスト中でキャラクタクラスを使うことができる (セットされていなければ使えない)。
RE_CONTEXT_INDEP_ANCHORS
このビットがセットされていると`^'`$'はリストの外であっても 特殊な意味を持つ。ビットがセットされていないとこれらのキャラクタは 特定の文脈でのみ特殊な意味を持つ。 セクション The Match-beginning-of-line Operator (^)を参照, and セクション The Match-end-of-line Operator ($)を参照
RE_CONTEXT_INDEP_OPS
このビットがセットされている場合、特定のキャラクタがリストの外であっても 特殊な意味を持つ。ビットがセットされていなければ、それらのキャラクタは ある特定の文脈でのみ特殊な意味を持ち、それ以外の場合は通常のキャラクタとなる。 具体的にいうと、このビットがセットされていない場合には`*'と、 (RE_LIMITED_OPSがセットされていなければ)`+'および`?'RE_BK_PLUS_QMの設定によっては`\+'`\?')が 繰り返し演算子となるのは、正規表現の先頭にないか、 open-group演算子もしくは選択演算子の直後にないときのみである。 これは、`{'(あるいは`\{'。これはRE_NO_BK_BRACESの 設定による)が正しいintervalの先頭にあり、かつRE_INTERVALS がセットされている場合も同様である。
RE_CONTEXT_INVALID_OPS
このビットがセットされていると繰り返し演算子及び選択演算子は 正規表現の特定の位置で使うことができなくなる。具体的には 正規表現が以下の場合に不正となるということである。 このビットがセットされていなければ、選択演算子や繰り返し演算子を 正規表現の任意の場所に置くことができる。 演算子が特定の場所で演算子として働くか否かはシンタクスビットに 依存する。
RE_DOT_NEWLINE
このビットがセットされているとmatch-any-character演算子は改行に マッチする。ビットがセットされていなければマッチしない。
RE_DOT_NOT_NULL
このビットがセットされているとmatch-any-character演算子はnullキャラクタに マッチし、ビットがセットされていなければマッチしない。
RE_INTERVALS
このビットがセットされていればRegexはinterval演算子を認識し、 ビットがセットされていなければ認識しない。
RE_LIMITED_OPS
このビットがセットされているとRegexは match-one-or-more、match-zero-or-one 、alternationといった演算子を 認識しない。ビットがセットされていなければ認識する。
RE_NEWLINE_ALT
このビットがセットされていると改行はalternation演算子をあらわすように なり、ビットがセットされていなければ改行は通常のキャラクタである。
RE_NO_BK_BRACES
このビットがセットされている場合、`{'がopen-interval演算子を、 `}' がclose-interval演算子を表す。ビットがセットされていない場合には `\{'がopen-interval演算子を、`\}'がclose-interval演算子を 表す。このビットはRE_INTERVALSがセットされているときのみ意味がある。
RE_NO_BK_PARENS
このビットがセットされている場合、`('がopen-group演算子を、 `)'がclose-group演算子を表す。このビットがセットされていなければ `\('がopen-group演算子を、`\)'がclose-group演算子を表す。
RE_NO_BK_REFS
このビットがセットされていると、Regexは後方参照の演算子である `\'digitを認識しない。ビットがセットされていなければ認識する。
RE_NO_BK_VBAR
このビットがセットされている場合には`|'が選択演算子を表し、 ビットがセットされていない場合には`\|'が選択演算子を表す。 このビットはRE_LIMITED_OPSがセットされているときには無意味である。
RE_NO_EMPTY_RANGES
このビットがセットされていると、範囲を表す正規表現中で 範囲の先頭より終端のほうがが小さいときにその正規表現を不正なものとする。 このビットがセットされていない場合にはその様な正規表現は空であると Regexは認識する。
RE_UNMATCHED_RIGHT_PAREN_ORD
このビットがセットされていて、かつ正規表現中にopen-group演算子が使われて いない場合、Regexはclose-group演算子(RE_NO_BK_PARENSの設定によるが) を`)'とマッチするように扱う。

Predefined Syntaxes

Regexを使ってプログラミングするときに、パターンバッファ (セクション GNU Pattern Buffersを参照, and セクション POSIX Pattern Buffersを参照)の シンタクスビット(セクション Syntax Bitsを参照)の組み合わせの可否、あるいは Regexのコンフィグレーションを決定するために syntaxフィールドをセットすることができる。 その様なコンフィグレーションには特定のプログラム、GNU Emacs、 POSIX Awk, 伝統的な Awk, Grep, Egrep--- のものに加えて、POSIXのbasic regular expressionsとextened regular expressionsがある。

あらかじめ定義されているシンタクスは以下の通り(`regex.h'から 直接抜き出したもの)。

#define RE_SYNTAX_EMACS 0

#define RE_SYNTAX_AWK                                                   \
  (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL                       \
   | RE_NO_BK_PARENS            | RE_NO_BK_REFS                         \
   | RE_NO_BK_VBAR               | RE_NO_EMPTY_RANGES                   \
   | RE_UNMATCHED_RIGHT_PAREN_ORD)

#define RE_SYNTAX_POSIX_AWK                                             \
  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)

#define RE_SYNTAX_GREP                                                  \
  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES                         \
   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS                            \
   | RE_NEWLINE_ALT)

#define RE_SYNTAX_EGREP                                                 \
  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS                    \
   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE                    \
   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS                             \
   | RE_NO_BK_VBAR)

#define RE_SYNTAX_POSIX_EGREP                                           \
  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)

/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC

#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC

/* Syntax bits common to both basic and extended POSIX regex syntax.  */
#define _RE_SYNTAX_POSIX_COMMON                                         \
  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL              \
   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)

#define RE_SYNTAX_POSIX_BASIC                                           \
  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)

/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
   isn't minimal, since other operators, such as \`, aren't disabled.  */
#define RE_SYNTAX_POSIX_MINIMAL_BASIC                                   \
  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)

#define RE_SYNTAX_POSIX_EXTENDED                                        \
  (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS                   \
   | RE_CONTEXT_INDEP_OPS  | RE_NO_BK_BRACES                            \
   | RE_NO_BK_PARENS       | RE_NO_BK_VBAR                              \
   | RE_UNMATCHED_RIGHT_PAREN_ORD)

/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
   replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added.  */
#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED                                \
  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS                  \
   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES                           \
   | RE_NO_BK_PARENS        | RE_NO_BK_REFS                             \
   | RE_NO_BK_VBAR          | RE_UNMATCHED_RIGHT_PAREN_ORD)

Collating Elements vs. Characters

POSIXは照合要素としてのキャラクタの考え方を一般化した。 照合要素(collating element)は "一バイト以上の、その時点で定義されている照合のユニットの並び"と定義される。

このキャラクタの概念の一般化には二つのやり方がある。 まず第一には、ある一つのキャラクタを二つ以上の照合要素にマッピングできる ということである。例えばドイツ語の は、照合要素`s'に別の照合要素`s'が続いたものとして照合が行われる。 第二に、二つ以上のキャラクタを一つの照合要素としてマッピングできる。 例えば、スペイン語の`ll'は前に`m'、後ろに`l'というものと 照合が行われる。

POSIX の"collating element" は"キャラクタ"の考え方を残している。 より親しまれていることから、このドキュメントでは後者を使うことにする。

The Backslash Character

`\'はあなたの設定したシンタクスビット(セクション Syntax Bitsを参照)と文脈によって、 以下に挙げる四つのうちいずれか一つの意味を持つ。 1) キャラクタそれ自身。2) 次に来るキャラクタをクォートする。 3) 演算子を作り出す。 4) 何もしない。

  1. シンタクスビットのRE_BACKSLASH_ESCAPE_IN_LISTSがセットされていない とき、リスト中(セクション List Operators ([ ... ] and [^ ... ])を参照)でそれ自身を表す。 たとえば、`[\]'`\'にマッチする。
  2. 次に来るキャラクタを、以下の場合にクォート(そのキャラクタに 特殊な意味があればそれを打ち消す)する。
  3. 特定のキャラクタが続いたときに、演算子となる。これは特定の シンタクスビットがセットされたときのみ有効である。 セクション Syntax Bitsを参照のRE_BK_PLUS_QM, RE_NO_BK_BRACES, RE_NO_BK_VAR, RE_NO_BK_PARENS, RE_NO_BK_REF を参照すること。
  4. 上記以外の場合、Regexは`\'を無視する。たとえば `\n'`n'にマッチする。

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