このサイトについて |
はじめに |
正規表現クイックスタート |
正規表現チュートリアル |
置換文字列チュートリアル |
アプリケーションとプログラミング言語 |
正規表現の例 |
正規表現リファレンス |
置換文字列リファレンス |
書籍レビュー |
印刷可能なPDF |
このサイトについて |
RSSフィード&ブログ |
ほとんどの現代的な正規表現フレーバーは、フリースペーシングモードと呼ばれる正規表現構文のバリアントをサポートしています。このモードにより、人間がはるかに読みやすい正規表現が可能になります。このチュートリアルで説明するフレーバーのうち、XML SchemaとPOSIXおよびGNUフレーバーのみがサポートしていません。プレーンなJavaScriptもサポートしていませんが、XRegExpはサポートしています。このモードは通常、正規表現の外でオプションまたはフラグを設定することで有効になります。モード修飾子をサポートするフレーバーでは、次のように入力できます。 正規表現の先頭に記述すると、正規表現の残りがフリースペーシングになります。
フリースペーシングモードでは、正規表現トークン間の空白は無視されます。空白には、スペース、タブ、改行が含まれます。トークン間の空白のみが無視されることに注意してください。a b cは、フリースペーシングモードではabcと同じです。しかし、\ dと\dは同じではありません。前者は dに一致し、後者は数字に一致します。\dは、バックスラッシュと「d」で構成される単一の正規表現トークンです。トークンをスペースで分割すると、エスケープされたスペース(スペースに一致)と、リテラルの「d」が得られます。
同様に、グループ化修飾子は分割できません。(?>atomic)は、フリースペーシングモードでは(?> ato mic )また、( ?>ato mic)としても同じです。これらはすべて同じアトミックグループに一致します。これらは(? >atomic)と同じではありません。後者は構文エラーです。?>グループ化修飾子は正規表現構文の単一の要素であり、一緒にする必要があります。これは、先読み、名前付きグループなどを含むすべてのこのような構文に当てはまります。
無視されるスペースと改行は、正規表現フレーバーによって異なります。このチュートリアルで説明するすべてのフレーバーは、ASCIIスペース、タブ、改行、復帰、およびフォームフィード文字を無視します。JGsoft V2とBoostは、すべての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は、新しいモード修飾子も追加します。 これにより、文字クラスの内側と外側の両方でフリースペーシングが有効になります。 これにより、以前と同様に文字クラスの外側でのフリースペーシングが有効になりますが、文字クラス内のフリースペーシングも無効になります。 と は両方ともフリースペーシングを完全に無効にします。
Javaは^を[ ^ a ]の中でリテラルとして扱います。スペースが無視されても、Javaではキャレットの特別な意味が損なわれます。Perl 5.26とPCRE2 10.30は、^を[ ^ a ]を/xxモードの否定キャレットとして扱います。Perl 5.26とPCRE2 10.30は、フリースペースを完全に無視します。それらはまだ、キャレットが文字クラスの先頭にあると考えています。
フリースペーシングモードのもう1つの機能は、#文字がコメントを開始することです。コメントは行末まで続きます。#から次の改行文字までのすべてが無視されます。ほとんどのフレーバーは、他の改行をフリースペースとして認識したり、アンカーを他の改行で一致させることを許可したりする場合でも、他の改行文字をコメントの終了として認識しません。JGsoft V2は、すべてのUnicode改行を認識する唯一のフレーバーです。Boostは垂直タブを見逃しています。
XPathとOracleは、フリースペーシングモードがあっても、正規表現内のコメントをサポートしていません。これらは常に#をリテラル文字として扱います。
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)
多くのフレーバーでは、フリー・スペーシングモードを使用せずに正規表現にコメントを追加することもできます。構文は(?#コメント)ここで、「コメント」は閉じ括弧を含まない限り、何でも構いません。正規表現エンジンは、(?#から最初の閉じ括弧までのすべてを無視します。
このチュートリアルで説明したフレーバーのうち、JavaとTclを除く、フリー・スペーシングモードでコメントをサポートするすべてのフレーバーも(?#コメント)をサポートします。フリー・スペーシングモードでコメントをサポートしない、またはフリー・スペーシングモードをまったくサポートしないフレーバーは、(?#コメント)もサポートしません。
| クイックスタート | チュートリアル | ツールと言語 | 例 | リファレンス | 書籍レビュー |
| はじめに | 目次 | 特殊文字 | 非印刷文字 | 正規表現エンジンの内部 | 文字クラス | 文字クラスの減算 | 文字クラスの交差 | 省略形文字クラス | ドット | アンカー | 単語境界 | 代替 | オプション項目 | 繰り返し | グループ化とキャプチャ | 後方参照 | 後方参照、パート2 | 名前付きグループ | 相対後方参照 | ブランチリセットグループ | フリー・スペーシングとコメント | Unicode | モード修飾子 | アトミックグループ化 | 所有数量子 | 先読みと後読み | 先読みと後読み、パート2 | マッチからテキストを除外 | 条件付き | バランシンググループ | 再帰 | サブルーチン | 無限再帰 | 再帰と量指定子 | 再帰とキャプチャ | 再帰と後方参照 | 再帰とバックトラック | POSIXブラケット式 | ゼロ長一致 | 継続的な一致 |
ページ URL: https://regular-expressions.dokyumento.jp/freespacing.html
最終更新日: 2023年3月1日
サイト最終更新日: 2024年3月15日
Copyright © 2003-2024 Jan Goyvaerts. All rights reserved.