クイックスタート
チュートリアル
ツールと言語
リファレンス
書籍レビュー
正規表現の例
数値範囲
浮動小数点数
メールアドレス
IPアドレス
有効な日付
数値の日日付をテキストに変換
クレジットカード番号
完全な行のマッチング
重複行の削除
プログラミング
近接する2つの単語
落とし穴
カタストロフィックバックトラッキング
過剰な繰り返し
サービス拒否攻撃
すべてをオプションにする
繰り返されるキャプチャグループ
Unicodeと8ビットの混在
このサイトの詳細
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—The most comprehensive regular expression library!

一般的なプログラミング言語の構文にマッチする正規表現の例

正規表現は、テキストエディタでソースコードを操作したり、正規表現ベースのテキスト処理ツールで使用したりするのに非常に便利です。ほとんどのプログラミング言語は、キーワード、コメント、文字列など、似たような構文を使用します。しかし、微妙な違いがあることが多く、正しい正規表現を使用するのが難しい場合があります。以下の例のリストから正規表現を選択する際には、各正規表現の説明をよく読んで、正しいものを選択していることを確認してください。

特に明記されていない限り、以下のすべての例では、ドットが改行に一致*せず*、キャレットとドル記号が埋め込み改行に一致*する*と仮定しています。多くのプログラミング言語では、これは単一行モードがオフで、複数行モードがオンになっている必要があることを意味します。

これらの正規表現を単独で使用すると、意図した結果が得られない場合があります。コメントが文字列内にある場合、コメントの正規表現は文字列内のテキストをコメントと見なします。文字列の正規表現は、コメント内の文字列にも一致します。解決策は、複数の正規表現を使用し、それらをこの疑似コードのように単純なパーサーに組み合わせることです。

GlobalStartPosition := 0;
while GlobalStartPosition < LengthOfText do
  GlobalMatchPosition := LengthOfText;
  MatchedRegEx := NULL;
  foreach RegEx in RegExList do
    RegEx.StartPosition := GlobalStartPosition;
    if RegEx.Match and RegEx.MatchPosition < GlobalMatchPosition then
      MatchedRegEx := RegEx;
      GlobalMatchPosition := RegEx.MatchPosition;
    endif
  endforeach
  if MatchedRegEx <> NULL then
    // At this point, MatchedRegEx indicates which regex matched
    // and you can do whatever processing you want depending on
    // which regex actually matched.
  endif
  GlobalStartPosition := GlobalMatchPosition;
endwhile

コメントに一致する正規表現と文字列に一致する正規表現をRegExListに配置すると、コメントの正規表現が文字列内のコメントに一致せず、その逆も同様であることを確認できます。ループ内で、一致がコメントか文字列かによって、一致を処理できます。

別の解決策は、正規表現を組み合わせることです(comment)|(string)選択は、上記のコードスニペットと同じ効果があります。この正規表現のすべての一致を反復処理します。ループ内で、どのキャプチャグループが正規表現に一致したかを確認します。グループ1が一致した場合、コメントです。グループ2が一致した場合、文字列です。それに応じて一致を処理します。

この手法を使用して、完全なパーサーを構築できます。解析する言語またはファイル形式のすべての字句要素の正規表現を追加します。ループ内で、何が一致したかを追跡し、後続の一致をコンテキストに応じて処理できるようにします。たとえば、中括弧のバランスを取る必要がある場合は、開き括弧が一致したときにカウンターを増やし、閉じ括弧が一致したときにカウンターを減らします。カウンターが途中で負になった場合、またはファイルの最後にゼロ以外になった場合は、エラーを発生させます。

コメント

#.*$は、#で始まり、行末まで続く単一行コメントに一致します。同様に、//.*$は、//.

で始まる単一行コメントに一致します。コメントが行頭にある必要がある場合は、^#.*$を使用します。行頭とコメントの間に空白のみが許可されている場合は、^\s*#.*$を使用します。C言語のコンパイラディレクティブまたはプラグマはこの方法で一致させることができます。この最後の例では、先頭の空白は正規表現の一致の一部になることに注意してください。キャプチャ括弧を使用して、空白とコメントを区切ります。

/\*.*?\*/は、ドットが改行に一致するオプションをオンにすると、Cスタイルの複数行コメントに一致します。一般的な構文はbegin.*?endです。Cスタイルのコメントは入れ子にすることはできません。「begin」部分がコメント内にある場合は無視されます。「end」部分が見つかるとすぐに、コメントは閉じられます。

プログラミング言語で入れ子になったコメントが許可されている場合、正規表現はカウントできないため、正規表現を使用してそれらを一致させる簡単な方法はありません。追加のロジックが必要です。

文字列

"[^"\r\n]*"は、文字列内に引用符文字が表示されない単一行文字列に一致します。否定文字クラスを使用する方が、遅延ドットを使用するよりも効率的です。"[^"]*"文字列が複数行にまたがることを許可します。

"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"は、バックスラッシュでエスケープされている場合に引用符文字が表示される単一行の文字列にマッチします。この正規表現は必要以上に複雑に見えるかもしれませんが、二重引用符が文字列の一部ではなく単独で出現した場合に大量のバックトラッキングを引き起こす可能性のあるより単純な解決策よりもはるかに高速です。"[^"\\]*(?:\\.[^"\\]*)*"文字列が複数行にまたがることを許可します。

上記の正規表現を調整して、2つ(場合によっては異なる)文字で区切られた任意のシーケンスに一致させることができます。開始文字にb、終了文字にe、エスケープ文字にxを使用する場合、エスケープなしのバージョンはb[^e\r\n]*eとなり、エスケープ付きのバージョンはb[^ex\r\n]*(?:x.[^ex\r\n]*)*e.

となります。数値

\b\d+\bは正の整数に一致します。単語境界を忘れないでください![-+]?\b\d+\bは符号を許可します。

\b0[xX][0-9a-fA-F]+\bはCスタイルの16進数に一致します。

((\b[0-9]+)?\.)?[0-9]+\bは、整数と、整数部がオプションの浮動小数点数に一致します。(\b[0-9]+\.([0-9]+\b)?|\.[0-9]+\b)は、整数部と小数部がオプションの浮動小数点数に一致しますが、整数には一致しません。

((\b[0-9]+)?\.)?\b[0-9]+([eE][-+]?[0-9]+)?\b科学表記法の数値にマッチします。仮数は整数または小数点以下の数値で、整数部は省略可能です。指数部は省略可能です。

\b[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?\bも科学表記法の数値にマッチします。前の例との違いは、仮数が小数点以下の数値の場合、整数部が必須であることです。

浮動小数点数の例をよく読むと、上記の正規表現がそこで使用されているものと異なることに気付くでしょう。上記の正規表現はより厳密です。単語境界を使用して、識別子など他のものの一部である数値を除外します。[-+]?を上記のすべての正規表現の先頭に付けて、正規表現にオプションの符号を含めることができます。上記の例ではそうしませんでした。なぜなら、プログラミング言語では、+と-は通常、符号ではなく演算子と見なされるからです。

予約語またはキーワード

予約語のマッチングは簡単です。選択肢を使用してそれらを連結するだけです。\b(first|second|third|etc)\b繰り返しますが、単語境界を忘れないでください。