クイックスタート
チュートリアル
ツール & 言語
リファレンス
書籍レビュー
正規表現チュートリアル
はじめに
目次
特殊文字
非印刷文字
正規表現エンジンの内部
文字クラス
文字クラスの減算
文字クラスの積集合
省略文字クラス
ドット
アンカー
単語境界
選択
オプション項目
繰り返し
グループ化とキャプチャ
後方参照
後方参照、パート2
名前付きグループ
相対後方参照
ブランチリセットグループ
自由な空白とコメント
Unicode
モード修飾子
アトミックグループ化
所有量指定子
先読みと後読み
先読み、パート2
一致からテキストを除外する
条件
バランシンググループ
再帰
サブルーチン
無限再帰
再帰と量指定子
再帰とキャプチャ
再帰と後方参照
再帰とバックトラッキング
POSIXブラケット式
ゼロ長の照合
照合の継続
このサイトの詳細
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—Better than a regular expression tutorial!

リテラル文字

最も基本的な正規表現は、次のような単一のリテラル文字で構成されます。a。これは、文字列内でその文字が最初に出現する箇所に一致します。文字列がJack is a boyの場合、これはaの後のJに一致します。このaが単語の途中にあるかどうかは、正規表現エンジンには関係ありません。それが重要な場合は、単語境界を使用して、正規表現エンジンに伝える必要があります。これについては後で説明します。

この正規表現は2番目のaにも一致できます。これは、最初の照合後、文字列の検索を開始するように正規表現エンジンに指示した場合にのみ行われます。テキストエディターでは、「次を検索」または「前方検索」機能を使用することで実行できます。プログラミング言語では、通常、前の照合後に文字列の検索を続行するために呼び出すことができる別の関数があります。

同様に、正規表現catは、catAbout cats and dogsに一致します。この正規表現は、3つのリテラル文字の連続で構成されています。これは、正規表現エンジンに次のように指示するようなものです。最初にcを見つけ、その直後にa、その直後にt.

が続くものを見つけます。正規表現エンジンはデフォルトで大文字と小文字を区別することに注意してください。catCatには一致しません。大文字と小文字の違いを無視するように正規表現エンジンに指示しない限り。

特殊文字

単なるリテラルテキストの検索以上のことを行うには、特別な用途のために特定の文字を予約する必要があります。このチュートリアルで説明されている正規表現のフレーバーでは、特殊な意味を持つ文字が12個あります。バックスラッシュ\、キャレット^、ドル記号$、ピリオドまたはドット.、縦棒またはパイプ記号|、疑問符?、アスタリスクまたは星*、プラス記号+、開き括弧(、閉じ括弧)、開き角括弧[、および開き中括弧{。これらの特殊文字は、しばしば「メタ文字」と呼ばれます。それらのほとんどは、単独で使用するとエラーになります。

これらの文字のいずれかを正規表現でリテラルとして使用する場合は、バックスラッシュでエスケープする必要があります。一致させたいのが1+1=2の場合、正しい正規表現は1\+1=2です。それ以外の場合、プラス記号には特別な意味があります。

バックスラッシュを省略した1+1=2は、有効な正規表現であることに注意してください。そのため、エラーメッセージは表示されません。ただし、1+1=2には一致しません。代わりにプラス記号の特殊な意味により、111=2123+111=234に一致します。

たとえば、+1のように、特殊文字を許可されていない場所でエスケープするのを忘れると、エラーメッセージが表示されます。

ほとんどの正規表現フレーバーでは、中括弧{を、a{1,3}のような繰り返し演算子の一部ではない限り、リテラル文字として扱います。したがって、通常はバックスラッシュでエスケープする必要はありませんが、必要に応じてエスケープすることもできます。ただし、いくつかの例外があります。Javaでは、リテラルの開き中括弧をエスケープする必要があります。Booststd::regexでは、すべてのリテラル中括弧をエスケープする必要があります。

]は、文字クラスの外ではリテラルです。文字クラス内では異なるルールが適用されます。これについては、文字クラスに関するトピックで説明します。繰り返しますが、例外があります。std::regexRubyでは、文字クラスの外であっても、閉じ角括弧をエスケープする必要があります。

その他の文字はすべて、バックスラッシュでエスケープしないでください。これは、バックスラッシュも特殊文字であるためです。バックスラッシュとリテラル文字を組み合わせることで、特別な意味を持つ正規表現トークンを作成できます。たとえば、\dは、0から9.

までの1つの数字に一致する省略形です。\Q\Eエスケープシーケンスもサポートしています。\Q\Eの間にある文字はすべて、リテラル文字として解釈されます。たとえば、\Q*\d+*\Eは、リテラルテキスト*\d+*に一致します。\Eは、正規表現の最後で省略できるため、\Q*\d+*は、\Q*\d+*\Eと同じです。この構文は、JGsoftエンジンPerlPCREPHPDelphiJavaで、文字クラスの内外両方でサポートされています。ただし、Java 4と5には\Q\Eが誤動作するバグがあるため、Javaでこの構文を使用しないでください。Boostは、文字クラスの外ではサポートしていますが、内ではサポートしていません。

特殊文字とプログラミング言語

プログラマーの方は、一重引用符や二重引用符のような文字が特殊文字ではないことに驚くかもしれません。それは正しいです。PowerGREPのような正規表現ツールまたはgrepツールや、EditPad Proのようなテキストエディターの検索機能を使用する場合、プログラミング言語で行うように引用符をエスケープしたり繰り返したりしないでください。

ソースコードでは、プログラミング言語によって文字列内でどの文字が特別な扱いを受けるかを覚えておく必要があります。それらの文字は、正規表現ライブラリが文字列を認識する前にコンパイラーによって処理されるためです。したがって、正規表現1\+1=2は、C++コードでは"1\\+1=2"として記述する必要があります。C++コンパイラーは、ソースコードでエスケープされたバックスラッシュを、正規表現ライブラリに渡される文字列内の単一のバックスラッシュに変換します。一致させたいのがc:\tempの場合、正規表現c:\\tempを使用する必要があります。C++ソースコードの文字列として、この正規表現は"c:\\\\temp"になります。確かに、1つのバックスラッシュに一致させるために4つのバックスラッシュが必要です。

さまざまなプログラミング言語で正規表現を使用する方法の詳細については、このWebサイトのツールと言語セクションを参照してください。