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

フリースペーシング正規表現

ほとんどの現代的な正規表現フレーバーは、フリースペーシングモードと呼ばれる正規表現構文のバリアントをサポートしています。このモードにより、人間がはるかに読みやすい正規表現が可能になります。このチュートリアルで説明するフレーバーのうち、XML SchemaPOSIXおよびGNUフレーバーのみがサポートしていません。プレーンなJavaScriptもサポートしていませんが、XRegExpはサポートしています。このモードは通常、正規表現の外でオプションまたはフラグを設定することで有効になります。モード修飾子をサポートするフレーバーでは、次のように入力できます。(?x)正規表現の先頭に記述すると、正規表現の残りがフリースペーシングになります。

フリースペーシングモードでは、正規表現トークン間の空白は無視されます。空白には、スペース、タブ、改行が含まれます。トークンの空白のみが無視されることに注意してください。a b cは、フリースペーシングモードではabcと同じです。しかし、d\dは同じではありません。前者は dに一致し、後者は数字に一致します。\dは、バックスラッシュと「d」で構成される単一の正規表現トークンです。トークンをスペースで分割すると、エスケープされたスペース(スペースに一致)と、リテラルの「d」が得られます。

同様に、グループ化修飾子は分割できません。(?>atomic)は、フリースペーシングモードでは(?> ato mic )また、( ?>ato mic)としても同じです。これらはすべて同じアトミックグループに一致します。これらは(? >atomic)と同じではありません。後者は構文エラーです。?>グループ化修飾子は正規表現構文の単一の要素であり、一緒にする必要があります。これは、先読み名前付きグループなどを含むすべてのこのような構文に当てはまります。

無視されるスペースと改行は、正規表現フレーバーによって異なります。このチュートリアルで説明するすべてのフレーバーは、ASCIIスペース、タブ、改行、復帰、およびフォームフィード文字を無視します。JGsoft V2Boostは、すべてのUnicodeスペースと改行を無視する唯一のフレーバーです。JGsoft V1はほぼそうですが、次の行制御文字(U+0085)を見逃しています。Perlは常に非ASCIIスペースをリテラルとして扱います。Perl 5.22以降は、非ASCII改行を無視します。Perl 5.16以前は、それらをリテラルとして扱います。Perl 5.18と5.20は、開発者に移行期間を与えるために、フリースペーシングモードでエスケープされていない非ASCII改行をエラーとして扱いました。

文字クラス内のフリースペーシング

文字クラスは一般に単一のトークンとして扱われます。[abc][ a b c ]とは同じではありません。前者は3つの文字のいずれか1つに一致しますが、後者は3つの文字またはスペースに一致します。言い換えれば、フリースペーシングモードは文字クラス内では効果がありません。文字クラス内のスペースと改行は、文字クラスに含まれます。これは、フリースペーシングモードでは、次を使用できることを意味します。または[ ]は単一のスペースに一致します。読みやすいと思う方を使用してください。16進エスケープ\x20ももちろん機能します。

ただし、Javaは、フリースペーシングモードでは文字クラスを単一のトークンとして扱いません。Javaは、文字クラス内のスペース、改行、コメントを無視します。そのため、Javaのフリースペーシングモードでは、[abc][ a b c ]と同じです。文字クラスにスペースを追加するには、バックスラッシュでエスケープする必要があります。しかし、フリースペーシングモードでも、否定キャレットは開き角括弧の直後に表示される必要があります。[ ^ a b c ]は、4つの文字のいずれかに一致します^, a, bまたはc同様に[abc^]も同様です。否定キャレットを適切な場所に配置すると、[^ a b c ]は、次の文字ではない任意の文字に一致しますa, bまたはc.

Perl 5.26は、オプションとして文字クラス内での限られたフリースペーシングを提供します。/xフラグは、以前のバージョンのPerlと同様に、文字クラスの外側でのみフリースペーシングを有効にします。ダブル/xxフラグは、さらに、Perl 5.26が文字クラス内のエスケープされていないスペースとタブをフリースペースとして扱うようにします。改行は、文字クラス内では依然としてリテラルです。PCRE2 10.30は、PCRE2_EXTENDED_MOREフラグをpcre2_compile()に渡すと、Perl 5.26と同じ/xxモードをサポートします。

Perl 5.26およびPCRE 10.30は、新しいモード修飾子も追加します。(?xx)これにより、文字クラスの内側と外側の両方でフリースペーシングが有効になります。(?x)これにより、以前と同様に文字クラスの外側でのフリースペーシングが有効になりますが、文字クラス内のフリースペーシングも無効になります。(?-x)(?-xx)は両方ともフリースペーシングを完全に無効にします。

Javaは^[ ^ a ]の中でリテラルとして扱います。スペースが無視されても、Javaではキャレットの特別な意味が損なわれます。Perl 5.26とPCRE2 10.30は、^[ ^ a ]/xxモードの否定キャレットとして扱います。Perl 5.26とPCRE2 10.30は、フリースペースを完全に無視します。それらはまだ、キャレットが文字クラスの先頭にあると考えています。

フリースペーシングモードでのコメント

フリースペーシングモードのもう1つの機能は、#文字がコメントを開始することです。コメントは行末まで続きます。#から次の改行文字までのすべてが無視されます。ほとんどのフレーバーは、他の改行をフリースペースとして認識したり、アンカーを他の改行で一致させることを許可したりする場合でも、他の改行文字をコメントの終了として認識しません。JGsoft V2は、すべてのUnicode改行を認識する唯一のフレーバーです。Boostは垂直タブを見逃しています。

XPathOracleは、フリースペーシングモードがあっても、正規表現内のコメントをサポートしていません。これらは常に#をリテラル文字として扱います。

Javaは、フリースペーシングモードで文字クラス内の#をコメントの開始として扱う唯一のフレーバーです。コメントは行末まで続くため、]を使用してコメントを閉じることができます。他のすべてのフレーバーは、文字クラス内の#をリテラルとして扱います。これには、/xxモードのPerl 5.26が含まれます。

すべてをまとめると、有効な日付に一致する正規表現を、複数の行に記述することで明確にすることができます。

# yyyy-mm-dd形式の20世紀または21世紀の日付に一致
((?:19|20)\d\d)            # 年(グループ1)
[- /.]                     # 区切り文字
(0[1-9]|1[012])            # 月(グループ2)
[- /.]                     # 区切り文字
(0[1-9]|[12][0-9]|3[01])   # 日(グループ3)

RegexBuddy makes regular expressions more readable with syntax coloring

フリー・スペーシングなしのコメント

多くのフレーバーでは、フリー・スペーシングモードを使用せずに正規表現にコメントを追加することもできます。構文は(?#コメント)ここで、「コメント」は閉じ括弧を含まない限り、何でも構いません。正規表現エンジンは、(?#から最初の閉じ括弧までのすべてを無視します。

このチュートリアルで説明したフレーバーのうち、JavaTclを除く、フリー・スペーシングモードでコメントをサポートするすべてのフレーバーも(?#コメント)をサポートします。フリー・スペーシングモードでコメントをサポートしない、またはフリー・スペーシングモードをまったくサポートしないフレーバーは、(?#コメント)もサポートしません。