正規表現メモ

最終更新日 2012年8月24日

正規表現は使い慣れれば便利なものですが、ツールによって 使える正規表現演算子(メタキャラクタ)に違いがあったりして 戸惑うこともあります。そこで、正規表現を扱うツールの 代表的なものを幾つか選び、そこで使われている正規表現演算子 をまとめてみました。

正規表現入門者/初心者の方へ

正規表現のチュートリアルが、 perlの正規表現チュートリアル にあります。Perl5.8のドキュメントですが、一般的な入門にも使えると思います。


Table of contents

  1. grepで使用できる正規表現
  2. egrepで使用できる正規表現
  3. sedで使用できる正規表現
  4. awkで使用できる正規表現
  5. Perlで使用できる正規表現
  6. Pythonで使用できる正規表現
  7. Rubyで使用できる正規表現
  8. gawk 3.0(以降)で使用できる正規表現
  9. Tcl 8.2.3(以降)で使用できる正規表現
  10. PCREで使用できる正規表現
  11. PHPで使用できる正規表現(mb_ereg)
  12. .NET Frameworkで使用できる正規表現
  13. Java(1.4以降)で使用できる正規表現
  14. POSIX 1003.2での正規表現について
  15. 各正規表現演算子の説明
  16. 各エスケープシーケンスの説明
  17. 各処理系正規演算子一覧表
  18. ある文字列を含まない正規表現
  19. リンク
  20. 用語集
  21. 参考文献

各種ユーティリティで使える正規表現

grepで使用できる正規表現演算子

GNU grepはデフォルトで以下に挙げるような、 POSIX 1003.2で規定されている Basic Regular Expressionと GNU grepで拡張されているいくつかの正規表現演算子が使えます。 これらのうち、\+、\?、\|、\w、\W、\<、\>、\b、\B はGNU grepの拡張であり、 POSIXの規定にはありません。また、他の古い処理系などでは[:alnum:] などの表記が使えないかもしれません。また、GNU grep 2.5以降ではPCREを使った Perl互換の正規表現指定ができます(PCREのリンクを有効にした場合)。 PCREによって使うことのできる正規表現については PCREで使える正規表現または PCRE man pageを参照してください。 使用されるモードはMULTILINEモードです。

POSIXのgrepでは、-Eオプションと共に起動した場合には 正規表現としてExtended Regular Expressionを受付ける ようになります。この場合使用できる演算子には

といったものがあります。POSIX 1003.2では EREで 後方参照が使えるとは定義されていませんが、 GNU grep は使用可能です。

egrepで使用できる正規表現演算子

GNU grep を egrepという名前で起動したときに使用できる 正規表現演算子は以下のものです。grepに-Eオプションを指定したときと 似ていますが、全く同一というわけではありません。また、通常egrepという 名前が付けられているものに比べ、使用できる演算子が増えているので 注意が必要です。
2003年2月21日付記: GNU grep 2.5では-Eオプション指定時とegrepで起動した ときの挙動は同一です。-Eオプション指定時の動作については 前の項を参照してください(2.4あたりでこうなったようです)。

sedで使用できる正規表現演算子

POSIX 1003.2で規定されているsedでは、以下の演算子が使用できます。

GNU sedでは上記のものに加えて、以下のものが使えます。

付記: GNU sed 4.0.5ではオプション指定によりEREを使えるようになります(使えるEREはGNU のegrepと同じ)。
GNU sed 4.1.2 ではオプション指定によりPerl5互換の正規表現を使えるように なります(有効にしてコンパイルした場合)。また、正規表現演算子として\s\Sが使えるようになっています。

awkで使用できる正規表現演算子

awkでの注意事項
処理系によっては、/[/]/のように、文字クラス指定中に/を置くと エラーとなる場合があります。これはそういった文字クラスの中に置かれた /を、正規表現をくくる/と取り違えるのが原因です。このばあい、/を\ を使ってエスケープする必要があります。
補足: gawk 3.0.x 以降では、扱える正規表現が拡張されました。 詳しくはgawk 3.0以降で使用できる正規表現演算子を 参照してください。

Perlで使用できる正規表現演算子

簡単なリファレンスがperlreref にあります。またチュートリアル があります。

特記事項 → Perlに関する特記事項

以下はPerl5.6で追加されたものです。詳しくは Perl5.6のドキュメン ト もしくは それ以降のバージョンのド キュメント を参照してください。

\pは後続する名前のクラス(プロパティ、スクリプト、ブロック)に属する文字にマッチし、 \Pは後続する名前のクラスに属さない文字にマッチします。クラスの名前が一文字のときは ブレースを省略できます。クラス名に"^"を前置することにより否定形の 指定を行うことも可能です。

Perl5.8では(5.6でも使えたようです)\pや¥Pで始まるプロパティ指定は 標準Unicode属性も可能です。詳しくはperlunicode を参照してください。日本語による説明がUnicode standardにもあります。

Perl 5.8ではユーザーが任意のプロパティを作成することができます(IsまたはInを 必ず前置)。詳しくは perlunicodeを 参照してください。一例をあげると

    sub InKana {
        return <<END;
    3040\t309F
    30A0\t30FF
    END
    }

というサブルーチンを定義することによって、ひらがなもしくはカタカナにマッチする プロパティInKanaを使用することが可能になります。perl 5.8.5ではこのサブルーチン 定義において intersection機能を使うことが可能となりました。詳しくは perlunicode585を 参照してください。

近々のリリースが予定されている Perl 5.10.0 では、 5.8までのものに加えさらに拡張がなされています。 基本的にはPerl 6のRulesで導入される機能の先取りが主です。 詳しくは perlre - Perl 正規表現 など。

Perl6で導入されるであろう正規表現(Rules)は Perl6 Rules(新たな正規表現) に簡潔にまとめられています。 それ以外にも Perl6 黙示録 5 (日本語訳) Exegesis 5 (日本語訳) Synopsis 5 (日本語訳) で詳しく述べられています。

Pythonで使用できる正規表現演算子

Python 1.5から、新たに re という正規表現モジュールが 提供されるようになりました(regexモジュールは既存のスクリプトのために 残されているだけだそうです)。基本的にはperl5で採用されている ものとほぼ同一ですが、幾つかの固有の拡張があります。詳しくは Python reモジュールで使える正規表現演算子 を参照してください。
組み込みモジュー ル re にもドキュメントがあります。

特記事項 → Pythonに関する特記事項

正規表現コンパイル時に指定できるオプションもあります。 Python 2.4 から以下のものが使えるようです。Perlとは異なり、conditionの 部分には名前つきパターンのグループ名も可能なようですが、先読み、後読み 等の指定はできないようです。

Ruby で使用できる正規表現演算子

Perl5とほぼ同等の正規表現が使えます。詳しいドキュメントは Ruby リファレンスマニュアル - 正規表現にあります。 Perl5との大きな違いは、後読み(戻り読み)がないことです(ただし、 鬼車を正規表現エンジンとして組み込んでいる1.9.0では可能)。

特記事項 → Rubyに関する特記事項

正規表現コンパイル時に指定できるオプションもあります。 Ruby1.9では新しい正規表現エンジン鬼車が組み込まれました。これに伴い、いくつかの 拡張、違いが存在します。詳しくは 鬼車正規表現 を参照してください。戻り読み、名前によるキャプチャが使えるようになっています。

gawk 3.0以降で使用できる正規表現演算子

{n, m}はデフォルトでは使えません。コマンドラインオプションで --re-intervalか--posixを指定する必要があります。また、--traditional, --re-interval, --posixを指定した場合はそれぞれ受け付ける正規表現演算子が異なります。詳しくは マニュアルを参照してください(後述のリンク参照)。
特記事項:
gawk 3.0.0以降、それまでのバージョンのものとは異なり "." が 改行にもマッチするように仕様が変更されました。 gawk 3.0に関しては http://www.kt.rim.or.jp/~kbk/gawk-30/index.html にマニュアルの邦訳があります。

Tcl 8.2.3(以降)で使用できる正規表現演算子

8.1になってPerl5ライクな正規表現が使えるようになっています。

メタ構文。 (?bc)regexp のように使います。複数同時に指定することが可能です。

正規表現が以下のシーケンスで始まっていた場合、解釈に違いが出ます。

詳しくは re_syntax をどうぞ。 日本語のドキュメントが Tcl 8.4.1 マニュアル ビルトインコマンドリファレンス re_syntax にあります。

PCRE(ver 4.x)で使用できる正規表現演算子

PCRE(Perl-compatible regular expressions) はPerl 5.8にほぼ準じた正規表現が使えます。いろいろな処理系でライブラリとして使われています。

PCREのPOSIXキャラクタクラス指定では"^"を前置した否定形も 使用することができます(ex: [^:digit:])。

PCRE 5.0ではUnicodeプロパティが使えます(有効にしてコンパイルした場合)。 その場合に使用できるプロパティは以下の表の通りです。使用する場合、 \p{Ll}、\P{Lu}のようにします(\pは指定するプロパティに含まれるキャラクタ、 \Pは指定するプロパティに含まれないキャラクタにマッチします)。 Perlと同様、\p{^Lu}のような否定形の指定も可能です。 \p,\Pに続く プロパティ指定が一文字である場合、ブレースは省略可能です。また、\Xという エスケープシーケンスも使えます。これは (?>\PM\pM*) と等価です(アクセント つきの文字などの指定です)。

PCRE 5.0で使えるUnicodeプロパティ
表記 意味
C Other
Cc Control
Cf Format
Cn Unassigned
Co Private use
Cs Surrogate
L 文字
Ll 小文字
Lm Modifier letter
Lo Other letter
Lt Title case letter
Lu 大文字
M Mark
Mc Spacing mark
Me Enclosing mark
Mn Non-spacing mark
N 数字
Nd 十進数字
Nl Letter number
No Other number
P Punctuation
Pc Connector punctuation
Pd Dash punctuation
Pe Close punctuation
Pf Final punctuation
Pi Initial punctuation
Po Other punctuation
Ps Open punctuation
S Symbol
Sc Currency symbol
Sk Modifier symbol
Sm Mathematical symbol
So Other symbol
Z Separator
Zl Line separator
Zp Paragraph separator
Zs Space separator

お断り:
PCREは、2007年10月10日時点で7.2までバージョンが上がっています。 色々追加されているものもあるのでこの情報は少々古いです。 内容に関しては最新バージョンに即して近々更新するつもりです。

PHP で使用できる正規表現演算子(mb_ereg)

マルチバイト対応PHPには三種類の正規表現ルーチンがありますが、 ここではマルチバイト文字対応のmb_eregにしぼって列挙します。 Rubyの正規表現ルーチンを使っているので、Rubyのものと基本的には同じです。 preg_*関数群はPCREを使っているので使える正規表現はPCRE に準じます。ereg_*で使える正規表現はPOSIX ERE[[:<:]][[:>:]] のようです(Henry Spencer作のライブラリらしい)。

PHP 5.0では新しいマルチバイト対応正規表現エンジンとして 鬼車が組み込まれました。鬼車についての詳細は 鬼車正規表現 を参照してください。PHP 5.0で使われている鬼車のバージョンは2.2.4のようです。

PHPの正規表現に関する幾つかの注意事項

  1. ereg はマルチバイト文字対応をしていません。
  2. ereg は \d \w のようなPerl5以後の拡張に見られるメタ文字を一切サポートしていません
  3. ereg は文字クラス指定のブラケットの中でエスケープを目的として \ を使うことはできません
  4. mb_ereg はマルチバイト文字対応していますが、正しく使うためには使用している 文字エンコーディングを適切に設定しなければなりません。
  5. mb_eregでは、置換の際に後方参照として $1, $2 のように$による指定ができません。
  6. pregはマルチバイト文字対応していますが使えるのはUTF-8のみで、 UTF-8使用時は修飾子として u を指定する必要があります。

.NET Frameworkで使用できる正規表現

特記事項 → NETの正規表現に関する特記事項

コンパイル時に指定できるオプションもあります。 詳しくは .NET Framework の正規表現を参照してください。

Java(1.4以降)で使用できる正規表現

特記事項 → Javaの正規表現に関する特記事項

コンパイル時に指定できるオプションもあります。 詳しくは Pattern (Java2 プラットフォーム SE v1.4.0を参照してください。


POSIX 1003.2

POSIX 1003.2での正規表現について

POSIX 1003.2では、二種類の正規表現 Basic Regular Expression (以下BRE)と Extended Reuglar Exression(以下ERE)が定められています。 BREを使用するユーティリティには、ed, ex, vi, more, sed, grepなど、 EREを使用するユーティリティには awk, egrep があります。 Regular ExpressoionsPOSIX 1003.2 regular expressionsに説明があります。

BRE で使える正規表現演算子(メタキャラクタ)は以下の通りです。

EREで使える正規表現演算子(メタキャラクタ)は以下の通りです。


正規表現演算子

各正規表現演算子の説明

.

任意のキャラクタ一文字とマッチします。処理系やオプション指定によって、 これが改行にマッチするものとしないものがあります。POSIX 1003.2では改行にも マッチするように規定されているようです。

幾つかの処理系でのオプション指定をまとめました →

*

演算子の直前に置かれている部分正規表現の可能な限り大きい繰り返しに マッチします。繰り返しの回数は0回でもかまいません。例を挙げると、

  fo*

は、foにもfooにもマッチしますし、f(oが一個もない)にもマッチします。 一般的には

  (foo)*

のように繰り返しの対象となるものは部分正規表現でも受け付けられますが、 処理系によっては文字の繰り返ししか認めていないものもあります。

*?

*と同様ですが、マッチングがものぐさ (lazy。non-greedy(慎ましやか)などの表現が使われることもあります)に行われる点が 異なります。 (参照: “ものぐさなマッチングとは”)

+
\+

*と似ていますが、直前にある部分正規表現の一回以上の繰り返しにマッチします。 つまり、 wh+y という正規表現は、why や whhhyにはマッチしますが、*とは違って、 wyとはマッチしません。 \+は、GNU grepやGNU sedで用いられるこれと等価な演算子です。 これは他の処理系では使えないでしょう。

+?

+と同様ですが、 マッチングがものぐさ (lazy。non-greedy(慎ましやか)などの表現が使われることもあります)に行われる点が 異なります。 (参照: “ものぐさなマッチングとは”)

?
\?

直前にある部分正規表現、もしくは空文字列にマッチします。 \?は、GNU grepやGNU sedで用いられるこれと等価な演算子です。 これは他の処理系では使えないでしょう。

??

?と同様ですが、 マッチングがものぐさ (lazy。non-greedy(慎ましやか)などの表現が使われることもあります)に行われる点が 異なります。 (参照: “ものぐさなマッチングとは”)

|
\|

これら二つの演算子は、選択を行なうためのものです。演算子の 左右に置かれた部分正規表現のいずれかにマッチします。 ^X|0 は先頭にXがある文字列か、0を含む文字列にマッチします (^と|は両方とも正規表現演算子ですが、その優先順位は ^が上のため、このような解釈になります)。 \|は、GNU grepやGNU sedで用いられる等価な演算子です。 これは他の処理系では使えないでしょう。

[char-list]

[]の中に置かれた文字のいずれかにマッチします。 これはキャラクタクラスなどと呼ばれます。[ABC]という 指定は、A, B, Cのいずれかにマッチします。 連続したキャラクタ群を指定する場合、その群の先頭と終端を -で繋いだ形で指定することができます。たとえば、[ABCDEFG]は [A-G]と等価な指定です。 ここでの順序はlocaleによって定められた順序に従います。 あるlocaleでは[a-z]に大文字の大部分が含まれたりする場合があります。 たとえば GNU/Linux の en_US localeでは、
a A b B c C d D ... x X y Y z Z という並びになります。

[の直後に^がきていた場合 には意味が逆になり、指定したキャラクタ群の補集合、つまり []内に置かれた文字以外の文字に マッチするということになります。たとえば[^ABC]という 正規表現は A, B, C 以外のキャラクタにマッチします。 範囲指定の終端と始点を共有する[a-c-e]のような指定をしたときの 動作は未定義です。

キャラクタクラスの中では多くのメタキャラクタがその意味を失います。 特に、伝統的なegrepでは、[]の中では\によるエスケープも効きません (\自体もその特殊な意味を失ってしまう)。そういった場合に ]や^、-といった[]内で特殊な意味を持つキャラクタをクラスに 含めたいときには []^-]のように記述します。つまり、^は [の直後以外に、]は[の直後(補集合を指定しているときには^の 直後)に置き、-はリストの最後に置くというやり方を使います。

最近の処理系では\によるエスケープや\を使ったメタキャラクタ(\wや\sなど)が 有効なものが多いようです。逆に、鬼車などでは[や-、]をキャラクタクラスに 含めるときはそれらをエスケープすることが推奨されています。

鬼車(やSunのJavaの正規表現パッケージ)では、キャラクタクラスの集合演算が 可能です。詳しくは 鬼車 正規表現の 文字集合の項を参照してください。

よくある勘違い
[^foo]bar という正規表現は、「fooではない文字列に続いてbarという文字列が続くもの」 ではありません。「fでもoでもない文字に続いてbarという文字列が続いたもの」 です。[]で囲んだものが表しているのは 文字列ではなく文字の集合(その中に含まれる/含まれない文字のどれか) だということに注意してください。

よくある勘違い その2
前述した通り、 ブラケットに囲まれている中ではほとんどのメタキャラクタはその特殊な意味を失います。 したがって、 [^(foo)]bar という正規表現もまた、「fooではない文字列に続いてbarという文字列が続くもの」 ではありません。「fでもoでも(でも)でもない文字に続いて barという文字列が続いたもの」 です。 []の内側では、文字列や(より小さな)正規表現要素をまとめるというカッコの 特別な意味は失われてしまうということに注意してください。

ではどうすれば?
Perl 5拡張が使えるのなら、 戻り読みで対処できます。 そうでない場合は ある文字列を含まない正規表現 を応用して頑張ってください。

陥りやすい罠
[亜-腕]とか [弌-熙] とか [亜-熙]といったものは、 それぞれ「JIS第一水準の範囲の漢字」や「JIS第二水準の漢字」、 「漢字」を表すものとして使われることが多いものですが、 Unicodeをベースとしているシステムの場合 (5.8以降のuse encodingしたPerlなど)、 このような表記をしても期待通りの動作をすることはありません。 なぜなら、Unicode (or ISO 10646/JIS X 0221)では漢字の並べ方が これまで用いられてきたJIS X 0208 のそれとは異なるためです。

(regexp)
\(regexp\)

(と)で囲むことにより、ある一部分の文字列や正規表現を ひとまとめに扱うことができます。 たとえば(bang)+という正規表現は、bangやbangbang、bangbangbang という文字列にマッチします。bang+としたときとどのように違うかを 確かめてみてください。

\(\)は、sed、grep、ed等 BREで使用される書き方で、働きは()と同じですが、 BREでは後方参照を行うための指定にもなります。 GNU grepの-Eオプション指定時では()も同様の働きをしますが、POSIX 1003.2 で規定されているEREでは後方参照が使えるという記述はありません。

{n,m}
{n,}
{n}
\{n\}
\{n,\}
\{n,m\}

m、nにはそれぞれ数値が入ります。数字が nだけの場合は、ちょうどn回の繰り返し の指定になります。{n,}という形の場合ではn回以上の繰り返し、{n,m}では nは繰り返しの下限、mは上限の指定となります。 たとえば{3,5}では(直前の正規表現の)3回から5回の繰り返しになります。 ですから、

hel{3,5}o

は helllo, hellllo, helllllo にマッチしますが、helloにはマッチ しません。 \{\}はsed、grep等で使用される書き方で、働きは{}と同じです。

繰り返しの回数は処理系ごとに制限があります。最も厳しい場合で255回 程度が最大値となります。あまり大きな数字は使えないと考えたほうが 良いでしょう。また、負の数を指定することは許されません。 最大値ですが、PerlやRuby1.8で32766、GNU grepやGNU sedで32767、 PCREで65535あたりです。(Pythonでは4294967295(32bitの無符号整数の最大値) まで可能?)

{m,n}?
{n,}?
{n}?

{m,n}等と同様ですが、 マッチングがものぐさ(non-greedy)に行われる点が異なります。

^

文字列の先頭にマッチします。^cryptは cryptにマッチしますが、 encryptにはマッチしません。処理系やモードによっては文字列中の改行の 直後(つまり行の始め)にもマッチします。

$

文字列の末尾にマッチします。たとえば go$はgoとマッチしますが、 goldにはマッチしません。処理系やモードによっては文字列中の改行の 直前(つまり行の終わり)にもマッチします。これは「アンカー」であり、 改行を表す文字そのものにマッチするのではないということに注意してください。

\<
\m,[[:<:]]

“単語”の先頭にマッチします。たとえば \<away は awayにマッチ しますが、farawayにはマッチしません。

Tclでは\mまたは[[:<:]]を使います。

\>
\M,[[:>:]]

“単語”の末尾にマッチします。ですから、gnu\>はgnuに マッチしますが、cygnusにはマッチしません。

Tclでは\Mまたは[[:>:]]を使います。

[:classname:]

POSIX1003.2ではキャラクタクラス指定のときに、 名前によるキャラクタークラスの指定ができるようになりました。 現在決められているものとそれぞれ意味は次のようになっています。これらのほかに そのときのロカールによって、ロカール依存のキャラクタクラスが使える場合があります。

POSIXキャラクタクラス
クラス名 意味
[:alnum:] アルファベットと(十進)数字
[:alpha:] アルファベット
[:blank:] 空白文字(スペース、タブ等)
[:cntrl:] 制御文字
[:digit:] 十進数字
[:graph:] 印字可能かつ表示可能な文字(スペースは印字可能だが表示可能ではない)
[:lower:] アルファベットの小文字
[:print:] 印字可能なキャラクタ(=制御文字以外のキャラクタ)
[:punct:] 句読点(通常の文字、数字、制御文字、スペースのいずれでもないキャラクター)
[:space:] スペース、タブ、改ページ
[:upper:] アルファベットの大文字
[:xdigit:] 十六進数字

これらは実際に使用するときには[[:lower:]]のような形になります (ブラケットが二重になることに注意してください)。 キャラクタークラスの名称は、Cライブラリ関数のisxxx(ここで、 xxxには上記のキャラクタークラスの名称が入ります)で識別されるのと 同じ集合を表します。[^:alnum:]のような否定形を使える処理系もあります。

注意すべきこととして、これらが実際に使用時に 表す文字集合は、その時点におけるロカール(locale)に影響される可能性 があるということです。例えば、ASCIIの場合には [A-Z]と[[:upper:]]、 [A-Za-z]と[[:alpha:]]などはそれぞれまったく同じ集合を表しますが、 非ASCII環境においては、[A-Z]がASCIIと同じ集合を表すのに対して、 ウムラウトやアクサングラーブなどがついた文字が [[:...:]]の方には含まれる可能性があります。 更に言えば、EBCDICなどの環境にあっては[A-Z]が正しく「AからZまでの 大文字」という集合を表さない可能性があるのに対し、[[:upper:]]は そうではありません。

Perl(5.6以降)および PCRE には[:word:] (単語構成文字にマッチ)があります。

幾つかのドキュメントで、[:blank:]がGNU拡張であるという記述がありますが、 手元にあるPOSIX 1003.2のドキュメントには[:blank:]の項目があります。 また、LC_CTYPEの設定により任意のキャラクタクラスを認識するようにしても良い ことになっています。

\w

“単語”を構成するキャラクタ、つまり文字と数字それにアンダースコア のいずれかにマッチします。これは[[:alnum:]]と同じ意味になります。

\W

“単語”を構成するキャラクタ以外のキャラクタの いずれかにマッチします。これは これは[^[:alnum:]](もしあれば[[^:alnum:]])と同じ意味になります。

\b
\y

“単語”の先頭、あるいは末尾にマッチします。言い換えれば、 “語の区切り”とマッチするということです。たとえば \bball\bは、前後に空白のある ball にはマッチしますが、baseballには マッチしません。

gawk 3.0.xでは、\bがバックスペースを表すエスケープシーケンスと 衝突するため、この演算子は \y となっています。Tclでも\yを使います。

\B
\Y

“単語”の中にある空文字列にマッチします。例を挙げると、 \Bgnu\Bは cygnus にはマッチしますが、gnuにはマッチしません。

一部の実装を除き、"a  "(aの後に空白二つ)が" \B "に マッチするようです(単語の境界にない空文字列にマッチ)。

Tclでは\Yを使用します。

\d

perl等で使用されるもので、[0-9]と同じ意味、つまり任意の十進数字と マッチします。

\D

\dと似ていますが、意味は[^0-9]、つまり十進数字以外の任意の一文字 とマッチします。

\s

「空白」一文字とマッチする正規表現演算子です。

注意: Emacs の正規表現にも \s がありますが、まったく違うものです。 Emacs の場合、syntax code を \s に続く文字で指定します

\S

「空白以外」の一文字とマッチする正規表現演算子です。

注意: Emacs の正規表現にも \S がありますが、まったく違うものです。 Emacs の場合、syntax code を \s に続く文字で指定します。 \s と \S の関係は \s が指定した syntax code に含まれるもの、 \S が指定した syntax code に含まれないもの。といったものです

\C

常に「1バイト」にマッチします。

\X

基本文字に続く任意個の合成文字で表されるUnicodeキャラクタにマッチします。

\A

^と似た働きをしますが、大きな違いは ^が文字列中に埋め込まれた改行の直後にもマッチする場合があるのに対して、 この演算子は常に文字列の先頭にのみマッチするということです。

\Z

$と似ていますが、異なるのは$が文字列中に埋め込まれた改行の 直前にもマッチすることがあるのに対して、この演算子は基本的には 文字列の末尾にのみマッチするという点です。ただし 文字列の最後の文字が改行であるとき、\Zは最後の改行の 直前にマッチします。したがって

   foo\Z
   foo\n

(ここで\nは埋め込みの改行)にはマッチしますが、

   foo\n\n

にはマッチしません。

\z

Perl 5.005で導入されたもので、\Zと似ていますが、\Zが文字列 末尾の改行の直前にもマッチするのに対して、この演算子は 文字列の末尾にのみマッチするという点が異なります。

\G

文字列の先頭もしくは(グローバル指定時の)前のマッチが終了した 位置にマッチします。

\`

バッファの先頭にマッチします。^は処理系によっては 改行の直後にもマッチしますが、この演算子はそういった場所には マッチしません。

\'

バッファの末尾にマッチします。$は処理系によっては 改行の直前にもマッチしますが、この演算子はそういった場所には マッチしません。

\1 \2 \3 \4 \5 \6 \7 \8 \9

これらはそれに先行して現れた\(\)(または())で囲まれた部分正規表現に 実際にマッチしている文字列を 表します。\に続く数字は、正規表現全体の中でそれが現れた 順番を示します。たとえば\1は最初に現れた部分正規表現に 対する参照であり、\7であれば七番目のものです。 この指定は、Perl、Ruby、Tcl、PCREは九番目を越える指定が可能です。 ただし、対応する部分正規表現があることが条件になります。また、 数字部分が0で始まってはいけません。8進数値指定との区別がつかないためです (注: PythonとPCREも、99までの指定ができます)。 たとえば \(abc|123\)def\1という正規表現では、 \1はabcか、123のいずれかになります。

Pythonでは、曖昧さをなくすために\g<num>という 表記が使えます。Perlではブレースを使って${1}のようにします。

\

\は厳密には正規表現演算子ではありません。しかし、 上述した正規表現演算子を文字そのものとして扱いたいような 場合に、その前に\を置くことによって演算子の働きを 抑制することができます。たとえば、\[は[というキャラクタ そのものに対する指定であって、キャラクタクラスの始まりを 示すものではありません。

[.string.]
[=char=]

[..]は collating symbol(照合シンボル)と呼ばれる 演算子で、[.と.]に挟まれたキャラクタ列を一つの照合要素 とみなすように指定します。 たとえば [.ch.]+は c か h の(任意の組み合わせの)繰り返しではなく、 chchのような繰り返しにマッチします。 一方[==]は equivalence class(等価クラス)と呼ばれるもので、 [=と=]の間にあるキャラクタと“等価”なキャラクタにマッチします。 たとえば[=e=]としたときに、 è、 é、 ê、 ë といったもの も含まれるという指定ができます。

現状では、Perl、PCREのように認識はするが動作はしないという実装が 主流のようです(Tclでは使える?)。

glibcでもコードとしては入っているようです。どのように使えるのかは 確かめていません。

(?# text)

正規表現中に置くコメントです。括弧内にあるものは マッチングには関係しません。

拡張モード時には、#から行末までがコメントになります。

(?imsx-imsx:pattern)
(?imsx-imsx)

正規表現のオプションを指定します。これを使うことによって オプションを以降の正規表現に部分的に適用することが可能となります。 i,s,m,xはそれぞれ独立に使用できます。-が先行している場合には そのオプションを打ち消す意味になります。(?:)はそのかっこに囲 まれた範囲に影響が限定されます。前者では以降のすべてに影響が及びます (このオプション指定が存在していない処理系もあります。 詳細は処理系のドキュメントを参照してください)。 Rubyではsオプションはありません。またmオプション指定時の動作は改行が'.'に マッチするようになります。 i,s,m,xのそれぞれの意味は以下のとおり。シングルラインモードおよび マルチラインモード についての詳細はそれぞれの処理系のドキュメントを参照してください。

正規表現修飾子の意味
修飾子 意味
i 大小文字の違いを無視する
s シングルラインモードにする(.が改行にマッチする)
m マルチラインモードにする(^と$が改行の直前直後にマッチ)
x 拡張表記を許可する

Pythonにはロカール依存を有効にするL修飾子と \w, \W, \b, \B の意味をUnicode のキャラクタプロパティに基づいたものにする u修飾子があります。

PCREには通常のマッチとものぐさマッチの指定とを逆転する(?U) オプションとPCRE_EXTRAモードを有効にする(?X)オプションがあります。PCRE_EXTRA モードでは、定義されていないバックスラッシュシーケンスがエラーになります。

Pythonで使用できる正規表現修飾子は下表のとおりです。

Pythonの正規表現修飾子の意味 修飾子対応するオプション意味 iIGNORECASE (I)大小文字の違いを無視する mMULTILINE (M)マルチラインモードにする(^と$が改行の直前直後にマッチ) sDOTALL (S)“.”が改行文字にマッチ xVERBOSE (X)拡張表記を許可する uUNICODE (U)\w \W \b \BがUnicodeの英数定義に従う lLOCALE (L)\w \W \b \Bがカレントのロカールでの英数定義に従う

Rubyで使用できる正規表現修飾子は下表のとおりです。

Rubyの正規表現修飾子の意味 修飾子対応するオプション意味 iRegexp::IGNORECASE大小文字の違いを無視する mRegexp::MULTILINEマルチラインモードにする(^と$が改行の直前直後にマッチ) xRegexp::EXTENDED拡張表記を許可する

.NET Frameworkで使用できる正規表現修飾子は下表の通りです。

.NETの正規表現修飾子の意味
修飾子対応するオプション意味
iRegexOptions.IgnoreCase大小文字の違いを無視する
sRegexOptions.Singlelineシングルラインモードにする(.が改行にマッチする)
mRegexOptions.Multilineマルチラインモードにする(^と$が改行の直前直後にマッチ)
nRegexOptions.ExplicitCapture(?...) で陽に名前付けまたは番号付けしたグループだけを有効なキャプチャにするように指定する。
xRegexOptions.IgnorePatternWhitespace拡張表記を許可する

Javaのjava.util.regexで使用できる正規表現修飾子は下表の通りです。

Javaの正規表現修飾子の意味
修飾子対応するオプション意味
iCASE_INSENSITIVE大小文字の違いを無視する
dUNIX_LINESUnixラインモードにする
sDOTALLシングルラインモードにする(.が改行にマッチする)
mMULTILINEマルチラインモードにする(^と$が改行の直前直後にマッチ)
uUNICODE_CASEUnicodeに準拠した大小文字を区別しないマッチングを指定する
xCOMMENTS拡張表記を許可する
(?:regexp)

部分正規表現のグルーピングを行いますが、 \( \)や()とは異なり 後方参照を行うことはできません。たとえば、 foo(?:bar)bazfoobarbazという文字列にマッチしますが、 foo(bar)bazの場合とは異なり、\1(またはそれに相当するもの)には なにもセットされません。

(?=regexp)

括弧内にある正規表現が続くことを要求する表明です。 マッチの結果の文字列には影響しません。 例えば、else(?= if)という正規表現は “else if” にマッチし ますが、Perlの$&のような正規表現全体にマッチした文字列は “else”となります(当然ながら、“ if”が後続していない “else”にはマッチしません)。

よくある勘違い
(?=foo)bar のように記述しても、「fooのあとにbarが続いている文字列」には なりません。 fooを先読みしてマッチのポイントは動かしませんので(それが先読みだから)、 その場所にbarがあるかどうかで判断します。マッチのポイントより 前にある文字列が存在するかどうかという判定ではありません (それをするのは戻り読み)。

(?!regexp)

(?=regexp)と似ていますが、 こちらは括弧内にある正規表現が続かないことを要求する 表明です。

肯定先読み と同様に、「ある文字列が先行していない文字列にマッチ」 させるためにこの表明を使うことはできません。

(?<=pattern)

括弧内にある正規表現が先行していることを要求する表明です。 マッチの結果の文字列には影響しません。例えば、(?<=\t)\wという 正規表現はタブに続く単語にマッチしますが、マッチした文字列全体を表す $&(Perlの場合)にはタブは含まれ ません。戻り読み (もしくは後読み (lookbehind))は 固定長の文字列に対してのみ働きます(処理系による。可変長の文字列を許可 する処理系もあります→ 詳細)。

(?<!pattern)

括弧内にある正規表現が先行していないことを要求する表明です。 マッチの結果の文字列には影響しません。例えば、(?<!foo)barという 正規表現はfooが先行しないbarにマッチしますが、マッチした文字列全体を表す $&(Perlの場合)には fooは含まれません。 後読み(もしくは戻り読み (lookbehind))は固定長の文字列に対してのみ 働きます(処理系による。可変長の文字列を許可する処理系もあります)。

(?>pattern)

一旦マッチした部分正規表現をバックトラックすることのないパターン です。したがって、(?>a+)abは何にもマッチしません。カッコ内のパターン がすべてのaを消費し、それを手放さないためです。

(?(condition)yes-pattern|no-pattern)
(?(condition)yes-pattern)

条件式です。(condition)は、括弧の中に置かれた整数(対応するかっこのペアが マッチしているときに正当)もしくは長さゼロの lookahead/lookbehind/evaluate 表明であることが望ましいです。

Pythonでは表明は使えません。.NETでは名前による後方参照の指定ができます。

(?{ code })

Perlにおいて、埋め込まれたPerlコードを実行します

(??{ code })

Perlにおいて、埋め込まれたPerlコードを実行してその結果を正規表現を表すものとして 使用します。

*+

*に似ていますが、決してバックトラックしません。

++

+に似ていますが、決してバックトラックしません。

?+

?に似ていますが、決してバックトラックしません。

{n,m}+
{n,}+
{n}+

{n,m}等に似ていますが、決してバックトラックしません。

(?P<name>...)
(?<name>...) (?'name'...)

マッチした文字列を name という名前で参照できるようにします。

(?<name>...) や (?'name'...)は .NETで使用される表現です

(?P=name), \g<name>
\k<name> \k'name'

対応する(?P<name>...) でキャプチャした文字列を参照します。\g<name> は置換テキスト中で使う表現です。

\k<name> や \k'name'は .NETで使用される表現です(\k<name>は Ruby1.9.0でも使用可)。

(?P>name)

対応する(?P<name>...) でキャプチャした文字列を参照します。PCREの再帰的表現で使用します。 以下に使用例を挙げます。バランスの取れた括弧の対にマッチします。

    (?P<pn>\(((?>[^()]+)|(?P>pn))*\))
(?<name1-name2>)

グループ定義を均等化します。既に定義されていたグループ name2 の定義を削除し、既に定義されていた name2 グループと現在のグループの間隔をグループ name1 に格納します。グループ name2 が定義されていない場合、一致はバックトラックされます。name2 の最後の定義を削除すると、name2 の以前の定義がわかるため、この構成体によって、かっこなど入れ子になった構成体を追跡するカウンタとしてグループ name2 のキャプチャのスタックを使用できます。この構成体では、name1 は省略できます。たとえば (?'name1-name2') のように、山かっこの代わりに一重引用符を使用することもできます。 (グループ化構成体より)

(?R)

PCREで、再帰的にパターンにマッチする表現です。

(?num)

PCREで、再帰的にパターンにマッチする表現です。 (?R)に似ていますが、 こちらはパターン全体ではなくnumに対応する キャプチャされた部分正規表現が再帰の対象です。この例もバランスの取れた 括弧の対にマッチします。

    (\()?[^()]+(?(1)\))

次のような使い方もできます。

    (sens|respons)e and (?1)ibility

これは \1 を使ったものとは異なり、sense and responsibility にもマッチします。

(?(R)...)

PCREで、再帰的パターンの開始を示します。

    <(?:(?(R)\\d++|[^<>]*+)|(?R))*>
\p{name}, \P{name}

ブレースに囲まれた名前で指定されたキャラクタ集合に属するキャラクタを指定します。 指定できるキャラクタ集合は一般に、Unicodeのプロパティ、スクリプト、ブロック、カテゴリです。 処理系によっては使える集合が制限されていたりします。

各エスケープシーケンスの説明

\a

警告(ベル)です。

\b

バックスペースを表しますが文字クラス内に制限される処理系があります。

\e

エスケープ文字。Perl、PCREで使えます。

\n

改行。

\r

キャリッジリターン。

\f

改ページ。

\t

水平タブです。

\octal

2~3桁の8進表現文字です。数値が3桁ない場合0を数値に前置します (後方参照と区別するため)。

\xhex
\xxxx

16進表現文字です。何桁の表記か可能かどうかが処理系によって異なる場合があります (1桁でも可とか)。

\x{hex}

Perl等で使えるもので任意長の16進表現文字です。

\cchar

Perl等で使えるもので、制御キャラクタをあらわします。 例えば \ci は水平タブになります。

\c[ や \c\ はそのままでは記述できない場合があります。 文字クラスの中に入れたり、\c\\のようにすることで回避できる場合があります。

\C-char

Rubyで使えるもので、制御キャラクタをあらわします。例えば \C-jは改行コードになります。

\M-char

Rubyで使えるもので、charと\x80をbitwise or した コードになります。例えば \M-@ は\xc0と等価です。Emacsでいうところの メタな文字です(正規表現のメタキャラクタと混同しないように)。

\uhhhh
\Uhhhhhhhh

Pyhton、Tcl等で使えるもので、それぞれ四桁、八桁の16進数表現文字です。Perlでは\u、\U とも別の意味があります。

\N{name}

Perl、Pythonで使えるもので名前付けられたキャラクタを表します。詳しくは charnamesを 参照してください。


処理系ごとの使用可能正規表現演算子一覧

以下に挙げた処理系についてのそれぞれが使用できる正規表現演算子の一覧です。

grep -E
GNU grep version 2.0 + multi-byte extension 1.01 with -E option
grep -G
GNU grep version 2.0 + multi-byte extension 1.01 with -G option
grep
GNU grep version 2.0 + multi-byte extension 1.01 as grep
egrep
GNU grep version 2.0 + multi-byte extension 1.01 as egrep
cgrep
cgrep 3.01 (default)
awk
GNU Awk (gawk) 2.11.1 + 3.0(MSDOS, SJIS) Dec 17 1992, patchlevel 1
Japanized GNU Awk (jgawk) 2.15.2 + 1.1
GNU Awk (gawk) 2.15, patchlevel 6 + multi-byte extension 1.04
GNU Awk 3.0.3 + multi-byte extension 1.08
sed
GNU sed version 1.18 + multi-byte extension 1.02
GNU sed version 4.1.2
各処理系正規演算子一覧表
演算子 grep -E grep -G grep egrep cgrep gawk sed gawk 3.0 GNU sed 4.1.2注4
GNU  sed 4.1.2 -r
.

*

+ × × × ×

\+ × × × ×
×
? × × × ×

\? × × × × ×
×
| × × × ×

\| × × × × ×
×
[]

() × × × ×

\(\) × × × × ×
×
{} × × × × × × ○注3 ×

\{\} × × × × ×
×
^

$

\<

\>

[::]

\w

\W
\s
×
×
×
×
×
×
×
×

\S
×
×
×
×
×
×
×
×

\b × 注1
\B
\` × × × ×
\' × × × ×
\n ×

記号等の説明

使用可能
gawk 2.11. 2.15.2で使用可能
gawk 2.11でのみ使用可能
× 使用できない
注1 \y が同じ働きをするものとしてサポートされています
注2 表最下行の\nのnは、実際には1から9の数字が入ります
注3
--posixまたは--re-intervalオプションが指定され たときに有効
注4
デフォルト時の動作

ある文字列を含まない正規表現

あるパターンの文字列にマッチする正規表現というのは比較的簡単に記述することができますが、 ある特定の文字列を含まない文字列にマッチする正規表現というのを記述するのは結構大変です。 そこで自動的にそういったパターンを生成するJavaScriptを貼り付けておきます (わたしのオリジナルではありません)。

対象文字列を入力してください:
結果:


リンク


用語集

POSIX
IEEE が策定を行なっている可搬性のあるオペレーティングシステム・ インターフェースの標準規格の名称。1003.2にはシェルその他のコマンドに ついての記述がある。
BRE
ERE

参考文献

Mastaring Regular Expressions
Jeffrey E.F. Friedl
O'Reilly & Associcates, Inc.
ISBN 1-56592-257-3
Mastaring Regular Expressions 2nd Edition
Jeffrey E.F. Friedl
O'Reilly & Associcates, Inc.
ISBN 0-596-00289-0
正規表現デスクトップリファレンス
Iony Stubblebine著 歌代和正 監訳 三島純子訳
オライリー・ジャパン
ISBN 4-87311-170-6
ISO/IEC 9945-2: 1993 (ANSI/IEEE Std 1003.2-1992) POSIX Part2

正規表現辞典
佐藤竜一著
翔泳社
ISBN 4798109126
4797328509正規表現ハンドブック
鹿島 和郎 吉村 晋一

ソフトバンクパブリッシング 2005-06-30
売り上げランキング :

Amazonで詳しく見る
by G-Tools
正規表現辞典
4798109126佐藤 竜一


Amazonで詳しく見る
by G-Tools
詳説 正規表現 第2版
Jeffrey E.F. Friedl 田和 勝

オライリー・ジャパン
2003-05-26
売り上げランキング 15,625
おすすめ平均 

Amazonで詳しく見る
   by G-Tools
正規表現デスクトップリファレンス
トニー スタッブルバイン Tony Stubblebine 歌代 和正 三島 純子

オライリージャパン
2004-01
売り上げランキング 31,906
おすすめ平均 

Amazonで詳しく見る
   by G-Tools
Ruby Magic―Rubyで極める正規表現
竹内 仁

オーム社
2002-09
売り上げランキング 112,860

Amazonで詳しく見る
   by G-Tools
正規表現ハンディリファレンス
ジェイシーエヌ

秀和システム
2001-11
売り上げランキング 92,640
おすすめ平均 

Amazonで詳しく見る
   by G-Tools
正規表現ケーススタディブック
ハーシー

毎日コミュニケーションズ
2004-06
売り上げランキング 15,209
おすすめ平均 

Amazonで詳しく見る
   by G-Tools

ホームページへ

Copyright 1997-2005 KIMURA Koichi(木村浩一)
この文書の無断転載はご遠慮ください。リンクについてはご自由にしていただいてかまいません。 質問、指摘等は kbk AT kt DOT rim DOT or DOT jp まで。