Next: , Previous: Grep Programs, Up: Top


5 正規表現

正規表現は,文字列のセットを記述するパターンです.正規表現は,より 小さな表現を統合する,様々なオペレータを使った算数的な表現で,同様に組み 立てられます.grepは,2つの異なるバージョンの正規表現構文,“ 基本”(BRE)と“拡張”(ERE)を理解します.gnu grepでは,ど ちらの構文を使っても,利用可能な機能に違いはありません.他のインプリメン テーションでは,基本正規表現はそんなに強力ではありません.以下の記述は, 拡張正規表現に当てはまります.基本正規表現との違いは,後で要約します.

基本的な構築ブロックは,一文字にマッチする正規表現です.すべての文字と数 字を含むほとんどの文字は,自分自身にマッチする正規表現です.特殊な意味を 持つあらゆるメタ文字は,バックスラッシュを前に置くことで引用可能です. ‘[’と‘]’で囲まれた文字のリストは,リストのあらゆる一文字とマッ チします.リストの最初の文字がキャレット‘^’の場合,リストに ないあらゆる文字にマッチします.例えば,正規表現 ‘[0123456789]’は,あらゆる数字にマッチします.文字の範囲は,ハイフ ンで分けられた,最初と最後の文字を与えることで指定できます.

正規表現は,以下の反復子の一つを続けてもかまいません.

.
ピリオド‘.’は,あらゆる単一文字にマッチします.
?
前の項目はオプションで,1回以下にマッチします.
*
前の項目の0回以上にマッチします.
+
前の項目の1回以上にマッチします.
{n}
前の項目の,正確にn回にマッチします.
{n,}
前の項目のn回以上にマッチします.
{n,m}
前の項目の,n回以上,m回以下にマッチします.

2つの正規表現を連結してもかまいません.結果として得られる正規表現は,そ れぞれの連結されたサブ表現にマッチする,2つのサブ文字列を連結した形式の, あらゆる文字列にマッチします.

2つの正規表現は,インフィクスオペレータ‘|’で連結してもかまいません. 結果として得られる正規表現は,サブ表現のどちらかにマッチする,あらゆる文 字列にマッチします.

反復子は連結子に優先し,反対に交換子に優先します.サブ表現全体は,これら の優先規則を無効にするためにカッコで囲んでもかまいません.

5.1 文字クラス

大カッコの表現とは,‘[’と‘]’で囲まれている文字のリストで す.それは,そのリストにある,あらゆる単一文字にマッチします.リストの最 初の文字がキャレット‘^’の場合,リストにないあらゆる文字に マッチします.例えば,正規表現‘[0123456789]’は,あらゆる数字にマッ チします.

大カッコ表現内部では,範囲表現はハイフンで分離されている2つの文字 から成り立ちます.それは,ロケールの照合順で,そのロケールの文字集合を用 いて,2つの文字の間をソートしたもの(その文字自身も含まれる)にある,あら ゆる単一文字にマッチします.例えば,デフォルトのCロケールでは, ‘[a-d]’は‘[abcd]’と同じです.ロケールの多くは辞書の順番でソー トされていて,それらのロケールでは‘[a-d]’は,一般的に‘[abcd]’ と同じではありません.例えば,‘[aBbCcDd]’と同じかもしれません.伝統 的な大カッコの解釈を得るために,LC_ALL環境変数を値‘C’に設定す ることで,Cロケールを使用することが可能です.

終りに,命名された特定の文字のクラスは,以下のように大カッコで前もって定 義されています.その解釈はLC_CTYPEロケールに依存します.以下の解 釈はCロケールのもので,LC_CTYPEロケールが指定されていない場合にデ フォルトになるものです.

[:alnum:]
英数文字: ‘[:alpha:]’と‘[:digit:]’.
[:alpha:]
アルファベット文字: ‘[:lower:]’と‘[:upper:]’.
[:blank:]
空白文字: スペースとタブ.
[:cntrl:]
コントロール文字.asciiでは,これらの文字は8進数コードで,000から 037までと177 (DEL)です.その他の文字セットでは,それが何であれ, 文字と同じです.
[:digit:]
数字: 0 1 2 3 4 5 6 7 8 9
[:graph:]
グラフィック文字: ‘[:alnum:]’と‘[:punct:]’.
[:lower:]
小文字:a b c d e f g h i j k l m n o p q r s t u v w x y z
[:print:]
印刷可能な文字: ‘[:alnum:]’,‘[:punct:]’,そしてスペース.
[:punct:]
句読点文字:! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
[:space:]
スペース文字: タブ,改行,垂直タブ,フォームフィード,キャリッジリター ン,そしてスペース.
[:upper:]
大文字: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z.
[:xdigit:]
16進数: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f.

例えば,‘[[:alnum:]]’は‘[0-9A-Za-z]’を意味しますが,後者の書式 は,Cロケールとascii文字の符号化に依存し,前者はロケールと文字集合 に依存しません.(これらのクラス名のカッコはジンボル名の一部で,追加時に は,カッコのリストを範囲を定めるカッコを含める必要があることに注意してく ださい)

ほとんどのメタ文字は,リスト内で特殊な意味を失います.

]
最初のリスト項目ではない場合,リストを終了します.そのため,‘]’をリ スト項目にしたい場合,それを最初に書く必要があります.
[.
開いている照合するシンボルを表現します.
.]
閉じている照合するシンボルを表現します.
[=
開いている等価クラスを表現します.
=]
閉じている等価クラスを表現します.
[:
有効な文字クラス名が続いている,開いている文字クラスを表現します.
:]
有効な文字クラス名が続いている,閉じている字クラスを表現します.
-
リストの最初または最後ではなく,範囲の最終の点ではない場合,範囲を表現し ます.
^
リストに無い文字を表現します.‘^’をリストの項目にしたい場合,最初以 外のどこかに書いてください.

5.2 バックスラッシュ文字

特定の文字が続くとき,‘\’は特殊ないもを持ちます.

\b
単語の端にある空の文字列にマッチします.
\B
単語の端ではない空の文字列にマッチします.
\<
単語の最初の空の文字列にマッチします.
\>
単語の終りの空の文字列にマッチします.
\w
単語の構成要素にマッチし,それは‘[[:alnum:]]’の同義語です.
\W
単語の構成要素ではないものにマッチし,それは‘[^[:alnum:]]’の同義語 です.

例えば,‘\brat\b’は,分離されている単語‘rat’にマッチし, ‘c\Brat\Be’は‘crate’にマッチしますが,‘dirty \Brat’は ‘dirty rat’にマッチしません.

5.3 アンカー

キャレット‘^’とドル記号‘$’は,それぞれ行の最初と最後の空の文字 列にマッチします.

5.4 後方参照

後方参照‘\n’(ここでのnは単一の10進数です)は,n番 目のカッコで囲まれた正規表現のサブ表現としてこれまでにマッチしていたサブ 文字列にマッチします.例えば,‘(a)\1’は‘aa’にマッチします.グ ループがマッチに関与していない状態で交換を使用するとき,後方参照は全体の マッチで失敗します.例えば,‘a(.)|b\1’は‘ba’にマッチしません. 複数の正規表現が‘-e’やファイルから‘-f file’で与えられていると き,後方参照はそれぞれの表現に対しローカルなものになります.

5.5 基本 vs 拡張

基本的な正規表現では,メタ文字‘?’,‘+’,‘{’,‘|’, ‘(’,そして‘)’は,その特別な意味を失います.その代わりにバック スラッシュバージョンの‘\?’,‘\+’,‘\{’,‘\|’, ‘\(’,そして‘\)’ を使用してください.

伝統的なegrepは,‘{’のメタ文字をサポートしておらず,その 代わりに‘\{’のサポートを実装しているものもあるので,移植性の高いス クリプトでは,‘egrep’のパターンで‘{’の使用を避け,リテラルの ‘{’にマッチさせるために‘[{]’を使用すべきです.

gnu egrepでは,‘{’がインターバルの指定を開始するも のとして無効な場合,‘{’は特殊なものではないと仮定して伝統的な使用 方法のサポートを試みます.例えば,シェルコマンド‘egrep '{1'’は,正 規表現の構文エラーを報告する代わりに,‘{1’の2文字を検索します. posix.2では,この動作を拡張として許可していますが,移植性の高いスク リプトではそれを避けるべきです.