Go to the first, previous, next, last section, table of contents.

正規表現の構文

正規表現には構文があり,そこではいくつかの文字は特別な意味を持ちます.そ れ以外の文字は通常の文字です.通常の文字は,単純な正規表現で,その 文字自体にマッチします.特別な文字とは,`$'`^'`.'`*'`+'`?'`['`]'`\'です.他に特別 な文字が定義されることはありません.正規表現に現われる他の文字は,すべて 通常の文字です.ただし,前に`\'がある場合は別です.

たとえば,`f'は特別な文字ではありません.したがって,通常の文字であ り,文字列`f'にマッチする正規表現となります(これは文字列`ff'に はマッチしません).同様に`o'`o'のみにマッチする正規表現です.

どんな2つの正規表現abも連結することができます.その結果, たとえばaがある文字列のはじめの部分にマッチし,bが残りの部分 にマッチするならば,abを連結すればその文字列にマッチする正 規表現が得られます.

単純な例を示します.正規表現`f'`o'を連結すると正規表現 `fo'となります.これは文字列`fo'のみにマッチします.これは些細 な例ですが,複雑なものを扱うには,特別な文字を使う必要があります.以下は そのリストです.

. (ピリオド)
は特別な文字で改行文字以外のあらゆる1文字にマッチします.連結を使えば, `a.b'のような正規表現が作れます.これは,`a'で始まり`b'で 終る3文字からなるどんな文字列にもマッチします.
*
はそれ自身は構成要素ではなく,接尾辞です.これは,前の正規表現を可能な限 り繰り返すことを意味します.`fo*'の場合には,`*'`o'に適 用され,`fo*'`f'の後ろに`o'が続いているものにマッチしま す.`o'の数がゼロも許されます.つまり`fo*'`f'にもマッチ します. `*'は常にその前にある最小の式に適用されます.したがって,`fo*'`fo'ではなく`o'が繰り返されます. `*'が現われると,まずマッチするものができるだけ長くなるように(でき るだけ繰り返して)使われます.次にパターンの残り部分をマッチさせます.こ れが失敗した場合には,バックトラックが行なわれます.つまり,`*'によっ て繰り返された構成要素のいくつかを捨てて,パターンの残り部分がマッチする ように試みます.たとえば,`ca*ar'`caaar'にマッチさせる場合, `a*'は,はじめ3つのすべての`a'マッチします.しかしこうすると, パターンの残りの部分は`ar'ですが,`r'しかないので失敗します. そこで`a*'`a'2つだけにマッチさせます.こうすればパターンの残 りもマッチします.
+
`*'に似た接尾辞ですが,前の式が少なくとも一度はマッチしなくてはな りません.たとえば,`ca+r'`car'および`caaaar'にマッチし ますが,`cr'にはマッチしません.しかし,`ca*r'はこれら3つすべ てにマッチします.
?
`*'に似た接尾辞ですが,前にある式は1回だけマッチするか,または現 われてはなりません.たとえば,`ca?r'`car'および`cr'にマッ チします.他のものにはマッチしません.
[ ... ]
`['文字集合のはじめを意味し,`]'はその終りを表します. 最も簡単な場合では,この2つのかっこの間の文字が集合となります.したがっ て,`[ad]'は1文字の`a'と1文字の`d'のどちらにもマッチしま す.また`[ad]*'`a'`b'だけからなる文字列にマッチします (空の文字列にもマッチします).これから`c[ad]*r'は,`cr'`car'`cdr'`caddaar'などにマッチすることがわかります. 文字集合には,文字範囲を書くことができます.これには,2つの文字の間に `-'を書きます.したがって,`[a-z]'はすべての英小文字にマッチし ます.これには個々の文字を自由に深できます.たとえば,`[a-z$%.]'は, すべての英小文字と`$'`%',およびピリオドにマッチします. 文字集合の中では,通常の特殊文字はもはや特殊ではないことに注意してくださ い.文字集合中では,まったく別に特殊文字があります.それは`]'`-'`^'です. To include a `]' in a character set, you must make it the first character. For example, `[]a]' matches `]' or `a'. To include a `-', write `---', which is a range containing only `-'. To include `^', make it other than the first character in the set.`]'を文字集合に含むには,これを最初の文字にします.たとえば, `[]a]'`]'`a'にマッチします.`-'を含むには, `---'とします.これは`-'のみを含む範囲です.`^'は集合の最 初になければ特別な意味を持ちません.
[^ ... ]
`[^'文字の補集合の始まりを意味します.これは指定された文字 を除くすべての文字にマッチします.したがって,`[^a-z0-9A-Z]'は英文 字と数字を除くすべての文字にマッチします. `^'は文字集合の中で先頭になければ特殊な意味は持ちません.`^'の 後ろの文字は,先頭にあるものとして扱われます(それが`-'`]'な ら特殊文字にはなりません). 文字の補集合は,改行文字にもマッチします.ただし,改行文字がマッチしては いけない文字の1つとして宣言された場合は別です.
^
は空の文字列にマッチする特殊な文字です.ただし,テキストの行の先頭の空文 字列だけにマッチします.それ以外には,どれにもマッチしません.したがって `^foo'は行の先頭にある`foo'にマッチします.
$
`^'と似ていますが,行の最後にあるものにマッチします.したがって, `xx*$'は行の最後にある1つ以上の`x'からなる文字列にマッチします.
\
には2つの機能があります.特殊文字(`\'を含む)の意味をなくすことと, 特別な構成要素を作ることです. `\'によって特殊文字の意味がなくなるので,`\$'`$'のみに マッチする正規表現となり,また,`\['`['にのみマッチする正規 表現となります.

注意:歴史的な互換性を保つため,特殊文字はそれが意味をなさない文脈の中で は,通常の文字として扱われます.たとえば,`*foo'では`*'の前に 式がないため,`*'を通常のものとして扱います.しかし,このような動作 に依存するのはよくありません.それよりも場所に無関係にいつも特殊文字には `\'を付けるのがよいでしょう.

多くの場合,`\'はその後ろにどのような文字が続いていても,その文字だ けにマッチします.しかしいくつか例外があります.それは`\'が前につく と特別な意味を持つ文字になるときです.これらの文字はそれ自身とつき合わせ たときは通常の扱いになります.次に`\'による特別な表現を示します.

\|
は選択を表します.abを正規表現としたとき, `a\|b'aまたはbにマッチするものにマッチし ます. したがって,`foo\|bar'`foo'または`bar'にマッチしますが, 他のものにはマッチしません. `\|'はできるだけ大きく取った式に適用されます.`\( ... \)' を使って囲んだときは,`\|'はその中だけに制限されます. また`\|'を何度でも使えるように,十分なバックトラッキング能力を備え ています.
\( ... \)
はグループを作ります.これには3つの目的があります.
  1. `\|'による選択の範囲を定めます.したがって,`\(foo\|bar\)x'`foox'または`barx'のどちらにもマッチします.
  2. 複雑な表現を囲み`*'が使えるようにします.したがって, `ba\(na\)*'`bananana'など`na'が何個か(0個以上)続くもの にマッチします.
  3. 囲んだ部分文字列があとで引用できるようになります.
この最後に使い方は,グループを作るという考え方によるものではありません. 別の機能を表す正規表現の構成要素に同じ`\( ... \)'を使うのですが, 意味が混同されることはありません.次はこの特徴の説明です.
\digit
`\( ... \)'が現われると,この中に書かれた正規表現にマッチしたテ キストのはじめと終りが記録されます.そして正規表現のそれより後ろでは `\digit'という表現が使え,"digit番目に出てきた`\ ( ... \)'でマッチしたテキスト"を意味します. 1つの正規表現に現われた,はじめの9個の`\( ... \)'にマッチした文 字列に,開きかっこの順に1から9までの番号を割り当てます.`\1'から `\9'が,対応する`\( ... \)'にマッチした文字列を引用するの に使われます. たとえば,`\(.*\)\1'は改行を含まない文字列で,同じもの2つからなって いるものにマッチします.`\(.*\)'がその半分を表すわけですが,これは どんなものにもマッチします.しかし,`\1'はそれにすぐ続いていて,か つまったく同じテキストにマッチしなければなりません.
\`
は空の文字列にマッチしますが,バッファの先頭にあるものにだけです.
\'
は空の文字列にマッチしますが,バッファの最後にあるものにだけです.
\b
は空の文字列にマッチしますが,単語の最初か最後にあるものにだけです. `\bfoo\b'は独立の単語の`foo'にマッチします.また `\bballs?\b'は独立の単語として現われた`ball'あるいは `balls'にだけマッチします.
\B
は空の文字列にマッチしますが,単語の最初や最後にあるものは除きます.
\<
は空の文字列にマッチしますが,単語の最初にあるものにだけです.
\>
は空の文字列にマッチしますが,単語の最後にあるものにだけです.
\w
は単語を構成する文字にマッチします.エディタの構文テーブルによって,この 文字が決まります.
\W
は単語を構成する文字に含まれない文字にマッチします.
\scode
codeが表す構文を構成する文字にマッチします.codeは構文を表 す文字です.たとえば,`w'は単語構成要素を,`-'は空白を, `('は開きかっこを表します.See section 構文テーブル.
\Scode
codeが表す構文を構成する文字でない文字にマッチします.

次に示すのは複雑な正規表現です.これは,Emacsで空白が続くかもしれない 文の最後を認識するのに使っています.Lispの構文では,空白とタブ文字が区別 できます.Lisp構文では,文字列定数はダブルクォートで囲みます.`\"' は正規表現の一部としてのダブルクォートを表します.`\\'は正規表現で バックスラッシュを,`\t'はタブ文字,`\n'は改行文字を表します.

"[.?!][]\"')]*\\($\\|\t\\|  \\)[ \t\n]*"

これは4つの部分がつながっています.ピリオド,`?'`!'のいずれ かにマッチする文字集合,閉じブラケット,引用符,閉じかっこにマッチする文 字集合の繰り返し,行末か,またはタブか,または2つの空白か,のいずれかに マッチするバックスラッシュ付かっこによる選択,そして空白にあたる文字にマッ チする文字集合の繰り返しです.


Go to the first, previous, next, last section, table of contents.