6 正規表現 ¶
正規表現は、テキストの選択に使うパターンです。たとえば、ed のコマンド
g/string/
は、string を含むすべての行を表示します。正規表現は、「s」コマンドでも、新しいテキストで置き換える古いテキストの選択に使います。
正規表現は、文字列リテラルの指定に加え、文字列の集合も表せます。そのように表される文字列は、対応する正規表現に一致するといいます。正規表現が行内の複数の文字列に一致できる場合、最も左の一致が選択されます。正規表現が可変個数の文字の一致を許す場合は、その位置から始まる最長の並びに一致します。
空の正規表現は、最後に処理した正規表現と等価です。したがって「/re/s//replacement/」は re を replacement に置き換えます。ただし、グローバルコマンドの command-list 内で正規表現を使う場合、「最後に処理した正規表現」は、command-list の最初の実行とその後の実行とで異なることがあります。グローバルコマンドを参照してください。
GNU 拡張として、正規表現 /re/ の後に接尾辞「I」を付けられます。これにより、ed は re による照合で大文字と小文字を区別しなくなります。この接尾辞は正規表現のコンパイル時に評価されるため、空の正規表現とともに指定することは無効です。
POSIX 基本正規表現の構文で正規表現を作るには、次の記号を使います。
c以下に挙げていない文字 c は、それ自身に一致します。「{」「}」「(」「)」「<」「>」も含まれます。
\cバックスラッシュでエスケープした文字 c は、「{」「}」「(」「)」「<」「>」「b」「B」「w」「W」「+」「?」を除き、それ自身に一致します。
.任意の1文字に一致します。
[char-class]char-class 内の任意の1文字に一致します。「]」を char-class に含めるには、最初の文字にする必要があります。文字の範囲は、その両端の文字を「-」で区切って指定できます。たとえば「a-z」は小文字を指定します。char-class では、次のリテラル表現でも文字の集合を指定できます。
[:alnum:] [:cntrl:] [:lower:] [:space:] [:alpha:] [:digit:] [:print:] [:upper:] [:blank:] [:graph:] [:punct:] [:xdigit:]
「-」が char-class の最初または最後の文字であれば、それ自身に一致します。char-class 内のその他すべての文字は、それ自身に一致します。
char-class 内の、次の形式のパターン:
[.col-elm.] [=col-elm=]
ここで col-elm は照合要素であり、これらは「locale」(5) に従って解釈されます。これらの構文の説明は「regex」(7) を参照してください。
[^char-class]改行以外で、char-class に含まれない任意の1文字に一致します。char-class の定義は上記と同じです。
^「^」が正規表現の最初の文字であれば、正規表現を行頭に固定します。それ以外の場合は、それ自身に一致します。
$「$」が正規表現の最後の文字であれば、正規表現を行末に固定します。それ以外の場合は、それ自身に一致します。
\(re\)(空でもよい)部分式 re を定義します。部分式は入れ子にできます。後に続く「\n」という形式の後方参照は、n 番目の部分式に一致したテキストに展開されます。n は [1,9] の範囲の数値です。たとえば正規表現「\(a.c\)\1」は文字列「abcabc」に一致しますが、「abcadc」には一致しません。部分式の順序は、左側の区切りの位置で決まります。
*直前の正規表現の0回以上の繰り返しに一致します。その正規表現は、1文字の正規表現か部分式です。「*」が正規表現や部分式の最初の文字であれば、それ自身に一致します。「*」演算子は、予期しない結果になることがあります。たとえば正規表現「b*」は、部分文字列「bbb」ではなく、文字列「abbb」の先頭に一致します。空文字列が唯一の最も左の一致となるためです。
\{n,m\}\{n,\}\{n\}直前の1文字の正規表現または部分式の、少なくとも n 回、多くても m 回の繰り返しに一致します。m を省略すると、少なくとも n 回に一致します。コンマも省略すると、ちょうど n 回に一致します。これらの形式が正規表現や部分式の先頭に現れた場合は、文字どおりに解釈されます(つまり、正規表現「\{2\}」は文字列「{2}」に一致する、などです)。
基本正規表現の演算子に対する次の拡張には、従来の ed の構文と区別するため、バックスラッシュ「\」を前置します。システムの正規表現の実装によっては利用できない場合があります。
\<\>直後の1文字の正規表現または部分式を、単語の先頭(「\<」の場合)または末尾(「\>」の場合)に固定します。ASCII では、単語とは、アンダースコア(_)を含む英数字が続く最長の文字列です。
\`\'行頭「\`」または行末「\'」に無条件で一致します。
\?直前の1文字の正規表現または部分式があってもなくても一致します。たとえば正規表現「a[bd]\?c」は、文字列「abc」「adc」「ac」に一致します。「\?」が正規表現や部分式の先頭に現れた場合は、リテラルの「?」に一致します。
\+直前の1文字の正規表現または部分式の1回以上の繰り返しに一致します。したがって正規表現「a\+」は「aa*」の略記です。「\+」が正規表現や部分式の先頭に現れた場合は、リテラルの「+」に一致します。
\b単語の先頭または末尾(空文字列)に一致します。したがって正規表現「\bhello\b」は「\<hello\>」と等価です。ただし、「\b\b」は有効な正規表現ですが、「\<\>」は無効です。
\B単語の内部の空文字列に一致します。
\w単語を構成する任意の文字(英字、数字、アンダースコア)に一致します。
\W単語を構成しない任意の文字に一致します。