Go to the first, previous, next, last section, table of contents.
正規表現には構文があり,そこではいくつかの文字は特別な意味を持ちます.そ
れ以外の文字は通常の文字です.通常の文字は,単純な正規表現で,その
文字自体にマッチします.特別な文字とは,`$',`^',`.',
`*',`+',`?',`[',`]',`\'です.他に特別
な文字が定義されることはありません.正規表現に現われる他の文字は,すべて
通常の文字です.ただし,前に`\'がある場合は別です.
たとえば,`f'は特別な文字ではありません.したがって,通常の文字であ
り,文字列`f'にマッチする正規表現となります(これは文字列`ff'に
はマッチしません).同様に`o'は`o'のみにマッチする正規表現です.
どんな2つの正規表現a,bも連結することができます.その結果,
たとえばaがある文字列のはじめの部分にマッチし,bが残りの部分
にマッチするならば,aとbを連結すればその文字列にマッチする正
規表現が得られます.
単純な例を示します.正規表現`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'では`*'の前に
式がないため,`*'を通常のものとして扱います.しかし,このような動作
に依存するのはよくありません.それよりも場所に無関係にいつも特殊文字には
`\'を付けるのがよいでしょう.
多くの場合,`\'はその後ろにどのような文字が続いていても,その文字だ
けにマッチします.しかしいくつか例外があります.それは`\'が前につく
と特別な意味を持つ文字になるときです.これらの文字はそれ自身とつき合わせ
たときは通常の扱いになります.次に`\'による特別な表現を示します.
- \|
-
は選択を表します.aとbを正規表現としたとき,
`a\|b'はaまたはbにマッチするものにマッチし
ます.
したがって,`foo\|bar'は`foo'または`bar'にマッチしますが,
他のものにはマッチしません.
`\|'はできるだけ大きく取った式に適用されます.`\( ... \)'
を使って囲んだときは,`\|'はその中だけに制限されます.
また`\|'を何度でも使えるように,十分なバックトラッキング能力を備え
ています.
- \( ... \)
-
はグループを作ります.これには3つの目的があります.
-
`\|'による選択の範囲を定めます.したがって,`\(foo\|bar\)x'は
`foox'または`barx'のどちらにもマッチします.
-
複雑な表現を囲み`*'が使えるようにします.したがって,
`ba\(na\)*'は`bananana'など`na'が何個か(0個以上)続くもの
にマッチします.
-
囲んだ部分文字列があとで引用できるようになります.
この最後に使い方は,グループを作るという考え方によるものではありません.
別の機能を表す正規表現の構成要素に同じ`\( ... \)'を使うのですが,
意味が混同されることはありません.次はこの特徴の説明です.
- \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.