Linux 備忘録

正規表現

正規表現

正規表現(せいきひょうげん:regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つ。正則表現(せいそくひょうげん)とも呼ばれ、形式言語理論の分野では比較的こちらの訳語の方が使われる。

もともと正規表現は形式言語理論において正規言語を表すための手段として導入された。形式言語理論では、形式言語が正規言語であることと正規表現によって表せることは同値である。

その後正規表現はテキストエディタ、ワードプロセッサをはじめとするアプリケーションソフトでパターンマッチ文字列を表すために使用されるようになり、表せるパターンの種類を増やすために本来の正規表現にはないさまざまな記法が新たに付け加えられた。このような拡張された正規表現には正規言語ではない文字列も表せるものも多く、ゆえに正規表現という名前は実態に即していない面もあるが、伝統的に正規表現と呼ばれ続けている。

伝統的な UNIX の正規表現
UNIX における基本正規表現の文法は POSIX によって旧式(obsolete)であるとされている。しかし、後方互換性のためにいまだに広く用いられている。ほとんどの正規表現を利用する UNIX のユーティリティ(grep や sed)ではデフォルトでこれを用いている。

この文法では、ほとんどの文字はリテラルに扱われる。つまり、ある文字はその文字にのみマッチする。例えば、”a” は a にマッチし、”(bc” は (bc にマッチするなど。例外はメタ文字と呼ばれる。

. 任意の文字にマッチする。
[ ] 括弧内に含まれる一文字にマッチする。例えば、[abc] は a、b、c にマッチする。英語のアルファベットでは、[a-z] は全ての小文字にマッチする。これらは混ぜることが出来る。[abcq-z] は a、b、c、q、r、s、t、u、v、w、x、y、z にマッチし、[a-cq-z]でも同様である。文字 ‘-’ は括弧内の最初か最後にあるときのみ、リテラルに扱われる。例えば、[abc-] や [-abc]。[ や ] にマッチさせる最も手っ取り早い方法は、囲んでいる括弧内で、括弧が最初になるようにすることである。例えば、[][ab] は ]、[、a、b にマッチする。
[^ ] 括弧内に含まれない一文字にマッチする。例えば、[^abc] は a、b、c 以外の任意の文字にマッチする。[^a-z] は小文字以外の任意の一文字にマッチする。上と同様にこれらは混ぜることが出来る。
^ 行の最初にマッチする。
$ 行の最後にマッチする。
\( \) これに囲まれた表現は、後に呼び出すことが出来る。次の \n の項を参照のこと。
\n ここで n は1から9までの数である。n 番目の \( \) で囲まれた部分にマッチする。この構文は理論的には不正で(正則文法の記述力を超える)、拡張正規表現では採用されていない。
* 一文字に続く “*” は0回以上の表現の繰り返しにマッチする。例えば、”[xyz]*” は “”、”x”、”y”、”zx”、”zyx” などにマッチする。
n を1から9までの数字としたとき、\n* は \( \) で囲まれた部分の0回以上の繰り返しにマッチする。例えば、”\(a.\)c\1*” は abcab や abcabab にマッチするが、abcac にマッチしない。
“\(” や “\)” で囲まれた表現に続く “*” は無効とされる。しかし、一部の環境ではそうならない。

\{x,y\} 直前の”ブロック”の x 回以上 y 回以下の繰り返しにマッチする。例えば、”a\{3,5\}” は aaa、aaaa、aaaaa にマッチする。

特定の正規表現の実装では、一部のメタ文字の前のバックスラッシュを異なって解釈する。例えば egrep や perl は、バックスラッシュの付いていない 括弧や縦棒 “|” をメタ文字と解釈し、バックスラッシュの付いているものをリテラルに解釈する。古いバージョンの grep は選言演算子 “|” をサポートしていない。

“.at” は hat、cat、bat のような三文字の文字列にマッチする
“[hc]at” は hat と cat にマッチする
“[^b]at” は bat 以外の “.at” でマッチする全ての文字列にマッチする
“^[hc]at” は行の最初にあるときだけ、hat と cat にマッチする
“[hc]at$” は行の最後にあるときだけ、hat と cat にマッチする

Leave a Comment

XHTML: Line-breaks are automatic. Available tags are <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> <img localsrc="" alt="">