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

文字列の開始と終了のアンカー

これまでは、リテラル文字文字クラスドットについて学習しました。正規表現にこれらを1つ入れると、正規表現エンジンは1つの文字と一致させようとします。

アンカーは種類が異なります。アンカーは文字と全く一致しません。代わりに、文字の前、後、または文字間の位置と一致します。正規表現の一致を特定の位置に「固定」するために使用できます。キャレット^は、文字列の最初の文字の前の位置と一致します。^aabcに適用すると、a. と一致します。^bは全く一致しません。なぜなら、abcbは、文字列の先頭直後と一致させることができないからです。で一致する文字列の先頭直後と一致させることはできません。正規表現エンジンの内部ビューについては、以下を参照してください。^と一致します。以下を参照してください。正規表現エンジンの内部ビューについては、以下を参照してください。

同様に、$$ は文字列の最後の文字の直後の位置と一致します。c$に適用すると、abcabcの c と一致しますが、a$は全く一致しません。

アンカーのみで構成される正規表現は、長さゼロの一致のみを見つけることができます。これは便利ですが、このチュートリアルの終わり近くで説明されている複雑さを生み出す可能性もあります。

便利なアプリケーション

プログラミング言語で正規表現を使用してユーザー入力を検証する場合、アンカーの使用は非常に重要です。ユーザーが入力したものが整数かどうかを確認するために、if ($input =~ m/\d+/)というコードをPerlスクリプトで使用すると、ユーザーがqsdf4ghjkと入力した場合でも、受け入れてしまいます。なぜなら、\d+44と一致するからです。使用する正しい正規表現は、^\d+$\d+です。「文字列の開始」はと一致するからです。使用する正しい正規表現は、が一致するためには、文字列全体が数字で構成されている必要があります。

ユーザーが誤ってスペースを入力することは簡単です。Perlがテキストファイルから行を読み取るとき、改行も変数に格納されます。そのため、入力を検証する前に、先頭と末尾の空白をトリミングすることをお勧めします。^\s+は先頭の空白と一致し、\s+$は末尾の空白と一致します。Perlでは、$input =~ s/^\s+|\s+$//gを使用できます。選択と /g を巧みに使用することで、これを1行のコードで実行できます。

^ と $ を行頭と行末のアンカーとして使用する

次のような複数行で構成される文字列がある場合、first line\nsecond line(ここで \n は改行を示します)、文字列全体ではなく、行単位で作業することが望ましいことがよくあります。そのため、このチュートリアルで説明するほとんどの正規表現エンジンには、両方のアンカーの意味を拡張するオプションがあります。^^ は、文字列の先頭(上記の文字列の f の前)と、各改行の後(\n と s の間)で一致するようになります。同様に、fの前)と、各改行の後(\nsの間)で一致するようになります。同様に、$$ は、文字列の末尾(最後の e の後)と、すべての改行の前(eの後)と、すべての改行の前(e\n).

e と \n の間)で一致します。EditPad Pro や GNU Emacs などのテキストエディタ、PowerGREP などの正規表現ツールでは、キャレットとドル記号は常に各行の先頭と末尾で一致します。これらのアプリケーションは、短い文字列ではなく、ファイル全体を操作するように設計されているため、これは理にかなっています。Rubystd::regex では、キャレットとドル記号も常に各行の先頭と末尾で一致します。Boost では、デフォルトで各行の先頭と末尾で一致します。Boost では、ECMAScript 文法を使用する場合、regex_constants::no_mod_mを使用してこれをオフにすることができます。

このウェブサイトで説明されている他のすべてのプログラミング言語とライブラリでは、この拡張機能を明示的にアクティブにする必要があります。これは伝統的に「複数行モード」と呼ばれています。Perl では、正規表現コードの後に m を追加することでこれを行います。たとえば、m/^regex$/m;のようにします。.NET では、RegexOptions.Multilineを指定すると、アンカーは改行の前後で一致します。たとえば、Regex.Match("string", "regex", RegexOptions.Multiline).

のようにします。

改行文字

ドットに関するチュートリアルページでは、さまざまな正規表現フレーバーによってどの文字が改行文字と見なされるかについてすでに説明しました。これは、複数行モードで、ドル記号が最後の改行の前に一致する場合に、アンカーにも同様に影響します。アンカーは、各正規表現フレーバーのドットと同じ方法で、単一文字で構成される改行を処理します。^$$^^$$^

は CRLF の途中と後で一致し、^ は CRLF の前と途中で一致します。

\Aは、文字列の先頭でのみ一致します。同様に、\Zは、文字列の末尾でのみ一致します。これらの2つのトークンは、改行では決して一致しません。これは、このチュートリアルで説明されているすべての正規表現フレーバーで当てはまります。「複数行モード」をオンにした場合でも同様です。EditPad Pro や PowerGREP では、キャレットとドル記号は常に各行の先頭と末尾で一致しますが、\A と \Z はファイル全体の先頭と末尾でのみ一致します。\A\Z\A と \Z

JavaScriptPOSIXXMLXPath は、\A と \Z をサポートしていません。この目的のために、キャレットとドル記号を使用する必要があります。\A\Z\A と \Z

POSIX 正規表現のGNU 拡張では、`(バッククォート)を使用して文字列の先頭を一致させ、'(シングルクォート)を使用して文字列の末尾を一致させます。 \``\''

改行で終わる文字列

Perl はファイルから行を読み取るときに末尾に改行が付いた文字列を返すため、Perl の正規表現エンジンは、複数行モードがオフの場合でも、文字列の末尾にある改行の前の位置で $ と一致します。Perl は、その文字が改行であるかどうかに関係なく、文字列の末尾でも $ と一致します。そのため、$$$$と一致するからです。使用する正しい正規表現は、に適用すると、123m/123$/123123123\n.

のどちらの場合でも一致します。最新の正規表現フレーバーのほとんどはこの動作をコピーしています。これには、.NETJavaPCREDelphiPHPPythonが含まれます。この動作は、「複数行モード」などの設定とは無関係です。

Python以外のこれらすべてのフレーバーでは、$ は最後の改行の前にも一致します。文字列の最後の末尾でのみ一致させる場合は、\Z$\z(大文字の Z ではなく小文字の z)を使用します。\A\d+\zは全く一致しません。なぜなら、123\n. \zは、改行の後では一致しません。改行は短縮文字クラス \d+ と一致しません。

Python では、$ は文字列の最後の末尾でのみ一致します。Python は \z をサポートしていません。\Z\z\z.

複数の改行で終わる文字列

文字列が複数の改行で終わり、複数行モードがオフの場合、$ は、最後の改行の前に一致できるすべてのフレーバーで、それらの改行の最後の前にのみ一致します。複数行モードに関係なく、\Z についても同じことが言えます。$$\Z\Z

Boost は唯一の例外です。Boost では、$ は、任意の数の末尾の改行の前、および文字列の最後の末尾で一致できます。そのため、対象の文字列が3つの改行で終わる場合、Boost の $ は一致できる位置が4つあります。他のすべてのフレーバーと同様に、Boost の $ は複数行モードとは無関係です。Boost の $ は、複数行モード(Boost ではデフォルトでオン)をオフにした場合にのみ、文字列の最後の末尾で一致します。\Z$\Z$\Z$$$

正規表現エンジンの内部を見る

複数行モードで^4$^47749\n486\n4^(ここで \n は改行文字を表します)と一致させようとするとどうなるかを見てみましょう。いつものように、正規表現エンジンは最初の文字 7 から始まります。正規表現の最初のトークンは ^ です。このトークンは長さゼロのトークンであるため、エンジンは文字と一致させようとせず、正規表現エンジンがこれまでに到達した文字の前の位置と一致させようとします。^77^447. 477744^^99\n8\n899

\n4^^444444に適用すると、4、そしてエンジンは正規表現トークンと文字列の文字の両方を進めます。今度はエンジンは$の前の位置(実際には:前)で一致を試みます8。ドル記号はここでは一致できません。なぜなら、この位置の後には文字があり、その文字は改行ではないからです。

もう一度、エンジンは最初のトークンとの一致を再度試みる必要があります。以前は、2番目の4で正常に一致したため、エンジンは次の文字、8で続行しますが、キャレットは一致しません。6と改行でも同じです。

最終的に、正規表現エンジンは文字列の3番目の4で最初のトークンとの一致を試みます。成功です。その後、エンジンは44を正常に一致させます。現在の正規表現トークンは$に進み、現在の文字は文字列の最後の位置、つまり文字列の後の空間に進みます。文字との一致を必要とする正規表現トークンは、ここでは一致できません。否定文字クラスでさえもです。しかし、ここではドル記号との一致を試みており、強力なドル記号は奇妙なものです。これは長さゼロであるため、現在の文字の前の位置との一致を試みます。この「文字」が文字列の後の空間であることは問題ではありません。実際、ドル記号は現在の文字をチェックします。$が現在の文字の前の位置と一致するためには、現在の文字は改行か文字列の後の空間のいずれかである必要があります。例の後ではそうなっているので、ドル記号は正常に一致します。

$が正規表現の最後のトークンであったため、エンジンは正常な一致を見つけました。文字列の最後の4です。