クイックスタート
チュートリアル
ツール&言語
リファレンス
書評
正規表現ツール
grep
PowerGREP
RegexBuddy
RegexMagic
一般的なアプリケーション
EditPad Lite
EditPad Pro
言語とライブラリ
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML スキーマ
Xojo
XQuery & XPath
XRegExp
データベース
MySQL
Oracle
PostgreSQL
このサイトについて
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書評
印刷可能な PDF
このサイトについて
RSS フィードとブログ
RegexBuddy—The best regex editor and tester for PCRE2 users!

PCRE2 オープンソース正規表現ライブラリ

PCRE2 は、Perl 互換正規表現バージョン 2 の略です。広く普及している PCRE ライブラリの後継です。どちらも Philip Hazel 氏によって C 言語で記述されたオープンソースライブラリです。

最初の PCRE2 リリースは、以前の PCRE 8.36 と明確に区別するためにバージョン番号 10.00 が付けられました。PCRE 8.37 から 8.44、および将来の PCRE リリースは、バグ修正のみに限定されています。新機能は PCRE2 のみに追加されます。新しい開発プロジェクトに着手する場合は、PCRE ではなく PCRE2 の使用を検討する必要があります。ただし、既に PCRE を使用している既存のプロジェクトでは、PCRE を使い続けるのがおそらく最善です。PCRE から PCRE2 への移行には、ソースコードに大幅な変更が必要です。そうする唯一の本当の理由は、新しい検索と置換機能を使用することです。

PHP 7.3.0 は PCRE から PCRE2 に移行しましたが、新しい PCRE2 検索と置換機能は使用していません。PHP 独自の置換テキスト構文を引き続き使用しています。

R 4.0.0 も、そのgrepおよび関連関数を PCRE から PCRE2 に移行しました。そのsubおよびgsub関数は、R 独自の置換テキスト構文を引き続き使用しています。

PCRE2 10.00 から 10.34、および PCRE 8.36 から 8.44 でサポートされている正規表現構文は、ほぼ同じです。そのため、この Web サイトの 正規表現チュートリアル で PCRE(または特に PCRE バージョン 8.36 から 8.44)について述べられていることはすべて、PCRE2 にも適用されます。PCRE2 は、PCRE と異なるいくつかの具体的な領域でのみ言及されています。

正規表現構文には、新しいバージョンチェック条件式が追加されました。構文は、名前付きバックリファレンスをチェックする条件式 と非常によく似ていますが、等号(およびキャプチャグループ名では許可されていない他の記号)が含まれているため、元の PCRE では構文エラーになります。PCRE2 のすべてのバージョンで、(?(VERSION>=10.00)yes|no)は文字列yesに一致します。yesno「yes」と「no」の部分には、有効な正規表現を使用できます。バージョンチェックが成功すると、「yes」の部分が試行されます。そうでない場合、「no」の部分が試行されます。これは、キャプチャグループが一致に関与したかどうかに応じて、縦棒の前または後の部分を評価する通常の条件式とまったく同じです。

最小バージョンを確認するには>=を使用するか、=特定のバージョンを確認するには(?(VERSION=10.00)yes|no)は文字列yesを PCRE2 10.00 で使用します。これはnoに一致します。PCRE2 10.10 以降のバージョンでは、マイナーバージョン番号を省略することは、.00を指定することと同じです。そのため、(?(VERSION>=10)yes|no)は文字列yesは PCRE2 のすべてのバージョンで一致しますが、(?(VERSION=10)yes|no)は PCRE2 10.00 でのみyesに一致します。マイナーバージョン番号を指定する場合は、小数点の後に 2 桁を使用する必要があります。3 桁以上の桁数は、バージョン 10.21 の時点ではエラーです。バージョン 10.21 では、先頭にゼロが付いたものを含む 1 桁の数字の解釈も変更されています。最初のリリースが 10.00 で、2 番目のリリースが 10.10 であったため、1 桁の数字を確認する必要はありません。マイナーバージョン番号を指定する場合は、小数点を省略できません。(?(VERSION>=1000)yes|no)はバージョン 1000.00 以上をチェックします。

このバージョンチェック条件式は、主に PCRE2 を間接的に使用する人、つまり PCRE2 をベースとした正規表現サポートを提供するアプリケーション、または PCRE2 を埋め込んでいるがすべての関数呼び出しを公開していないプログラミング言語を使用する人を対象としています。これにより、アプリケーションで使用されている PCRE2 のバージョンを調べることができます。PCRE2 C ライブラリを使用してアプリケーションを開発する場合は、関数呼び出しを使用して PCRE2 のバージョンを決定する必要があります。

char version[255];
pcre2_config(PCRE2_CONFIG_VERSION, version);

UTF-8、UTF-16、または UTF-32

元の PCRE ライブラリでは、UTF-16 と UTF-32 のサポートは、pcre16_ と pcre32_ で始まる追加の関数によって、後のバージョンに追加されました。PCRE2 では、すべての関数は pcre2_ で始まり、_8、_16、または _32 で終わって、8 ビット、16 ビット、または 32 ビットのコードユニットを選択します。ソースから PCRE2 をコンパイルする場合は、--enable-pcre2-16および--enable-pcre2-32configureスクリプトに渡して、_16 と _32 関数が使用可能になるようにする必要があります。

8 ビット、16 ビット、または 32 ビットのコードユニットとは、PCRE2 が文字列を 1 バイト文字、2 バイト文字、または 4 バイト文字で構成されているものとして解釈することを意味します。UTF-8、UTF-16、または UTF-32 を操作するには、対応するコードユニットサイズの関数を使用し、PCRE2_UTF オプションを pcre2_compile に渡して、文字が複数のコードユニットで構成されることを許可する必要があります。UTF-8 文字は 1 ~ 4 バイトで構成されます。UTF-16 文字は 1 つまたは 2 つのワードで構成されます。

以下に示すように、サフィックスなしで PCRE2 関数を呼び出す場合は、PCRE2_CODE_UNIT_WIDTH を 8、16、または 32 として定義して、サフィックスなしの関数が 8 ビット、16 ビット、または 32 ビットのコードユニットを使用するようにする必要があります。ライブラリを含める前に、次のように行います。

#define PCRE2_CODE_UNIT_WIDTH 8
#include "pcre2.h"

サフィックスなしの関数は、常に定義したコードユニットサイズを使用します。サフィックス付きの関数は引き続き使用できます。そのため、アプリケーションでは、3 つのコードユニットサイズすべてで正規表現を使用できます。ただし、それらを混同しないことが重要です。同じ正規表現を UTF-8 文字列と UTF-16 文字列に対して照合する必要がある場合は、pcre_compile_8 と pcre_compile_16 を使用して 2 回コンパイルし、対応する pcre_match_8 と pcre_match_16 関数でコンパイル済み正規表現を使用する必要があります。

PCRE2 の使用方法

PCRE2 の使用は、PCRE の使用よりも少し複雑です。PCRE2 では、改行処理などの特定のコンパイルオプションや照合オプションを渡すために、さまざまなタイプのコンテキストを使用する必要があります。PCRE では、これらのオプションは、コンパイル時または照合時にオプションビットとして直接渡すことができました。

正規表現を使用する前に、効率を向上させるためにバイナリ形式に変換する必要があります。これを行うには、正規表現を文字列として渡して pcre2_compile() を呼び出すだけです。文字列がヌル終端されている場合は、2 番目のパラメーターとして PCRE2_ZERO_TERMINATED を渡すことができます。そうでない場合は、コードユニットの長さを 2 番目のパラメーターとして渡します。UTF-8 の場合、これはバイトの長さですが、UTF-16 または UTF-32 の場合、これはバイトの長さを 2 または 4 で割った長さになります。3 番目のパラメーターは、バイナリ OR で組み合わせたオプションのセットです。適切な UTF-8、UTF-16、または UTF-32 サポートには PCRE2_UTF を含める必要があります。省略すると、純粋な 8 ビット、UCS-2、または UCS-4 文字処理が行われます。他の一般的なオプションには、PCRE2_CASELESS、PCRE2_DOTALL、PCRE2_MULTILINE などがあります。4 番目と 5 番目のパラメーターは、エラー条件を受け取ります。最後のパラメーターはコンテキストです。特別な改行処理が必要ない場合は NULL を渡します。この関数は、割り当てたメモリのポインターを返します。正規表現が不要になったら、pcre2_code_free() を使用して解放する必要があります。

デフォルト以外の改行処理が必要な場合は、pcre2_compile_context_create(NULL) を呼び出して新しいコンパイルコンテキストを作成する必要があります。次に、そのコンテキストと PCRE2_NEWLINE_LF や PCRE2_NEWLINE_CRLF などのオプションの 1 つを渡して pcre2_set_newline() を呼び出します。次に、このコンテキストを pcre2_compile() の最後のパラメーターとして渡します。同じコンテキストを、必要な数の正規表現コンパイルに使用できます。コンテキストが不要になったら、pcre2_compile_context_free() を呼び出します。元の PCRE では、PCRE_NEWLINE_LF などを pcre_compile() に直接渡すことができました。これは PCRE2 では機能しません。PCRE2 は、PCRE2_NEWLINE_LF などを pcre2_compile() に渡しても文句を言いません。しかし、そうしても効果はありません。照合コンテキストを使用する必要があります。

コンパイル済み正規表現を使用して文字列の中で一致を見つける前に、pcre2_match_data_create_from_pattern() を呼び出して、一致結果を格納するメモリを割り当てる必要があります。コンパイル済み正規表現を最初のパラメーターとして、NULL を 2 番目のパラメーターとして渡します。この関数は、割り当てたメモリのポインターを返します。一致データが不要になったら、pcre2_match_data_free() を使用して解放する必要があります。同じ一致データを pcre2_match() の複数回呼び出しに使用できます。

一致を見つけるには、pcre2_match() を呼び出して、コンパイル済み正規表現、対象文字列、文字列全体の length、一致試行を開始する文字の offset、照合オプション、一致データオブジェクトへのポインター、およびコンテキストの NULL を渡します。length と開始 offset は、文字ではなくコードユニットです。関数は、一致が成功すると正の数を返します。PCRE2_ERROR_NOMATCH は、一致が見つからなかったことを示します。その他の非正の戻り値はエラーを示します。エラーメッセージは、pcre2_get_error_message() を使用して取得できます。

文字列の一致した部分がどこにあるかを知るには、pcre2_get_ovector_pointer() を呼び出します。これにより、PCRE2_SIZE 値の配列へのポインターが返されます。このポインターを解放する必要はありません。pcre2_match_data_free() を呼び出すと無効になります。配列の長さは、pcre2_match() によって返される値です。配列の最初の 2 つの値は、全体の一致の開始と終了です。2 番目のペアは、最初のキャプチャグループの一致であり、以降も同様です。正規表現に名前付きキャプチャグループがある場合は、pcre2_substring_number_from_name() を呼び出してグループ番号を取得します。

一致したテキストを取得するだけの場合、pcre2_substring_copy_bynumber() や pcre2_substring_copy_byname() などの便利な関数を使用できます。キャプチャグループの数または名前、または全体の一致の場合は 0 を渡します。結果は pcre2_substring_free() を使用して解放します。結果をヌル終端する必要がない場合は、pcre2_substring_get_bynumber() と pcre2_substring_get_byname() を使用して、元の対象文字列内の一致の開始へのポインターを取得できます。pcre2_substring_length_bynumber() と pcre2_substring_length_byname() は、一致の長さを返します。

PCRE2には、文字列内の正規表現のすべてのマッチを返す関数はありません。最初のマッチのみを返します。2番目のマッチを取得するには、`pcre2_match()`を再度呼び出し、最初のマッチの終了位置(`ovector[1]`)を2番目のマッチ試行の開始位置として渡します。最初のマッチがゼロ長の場合、同じゼロ長マッチを再度検出しないように、`pcre2_match()`に渡されるオプションに`PCRE2_NOTEMPTY_ATSTART`を含めます。これは、呼び出しの前に開始位置を増分することとは異なります。`PCRE2_NOTEMPTY_ATSTART`と共に前のマッチの終了位置を渡すと、同じ位置でゼロ長ではないマッチが見つかる可能性があります。

マッチの置換

PCREのウィッシュリストにずっと載っていた最も大きな項目は、おそらく検索と置換の機能でしょう。PCRE2はついにそれを実現しました。置換文字列の構文は非常にシンプルです。ただし、Perlとの互換性はありません。バックリファレンスは次のように指定できます。$groupまたは${group}ここで「group」は、グループの名前または番号のいずれかです。全体の一致はグループ番号0です。置換文字列にリテラルのドル記号を追加するには、それを2つ重ねる必要があります。有効なバックリファレンスの一部ではない単一のドル記号はエラーです。Pythonと同様に、Perlとは異なり、PCRE2は存在しないグループへのバックリファレンス非参加グループへのバックリファレンスをエラーとして扱います。バックスラッシュはリテラルです。

マッチを置換する前に、`pcre2_compile()`を使用して正規表現をコンパイルする必要があります。正規表現のマッチングと置換の両方で、同じコンパイル済み正規表現を使用できます。置換にはマッチデータオブジェクトは必要ありません。

`pcre2_substitute()`を呼び出し、コンパイルされた正規表現、対象文字列、対象文字列の長さ、正規表現のマッチングを開始する文字列内の位置、およびマッチングオプションを渡します。開始位置以降のすべてのマッチを置換する(最初のマッチのみではなく)には、マッチングオプションに`PCRE2_SUBSTITUTE_GLOBAL`を含めることができます。次のパラメータは、マッチデータとマッチコンテキスト用で、どちらもNULLに設定できます。次に、置換文字列とその長さを渡します。最後に、結果文字列を格納するバッファへのポインタと、バッファのサイズを保持する変数へのポインタを渡します。バッファには、終端のゼロのためのスペースが必要です。すべての長さやオフセットは、文字ではなくコード単位です。

`pcre2_substitute()`は、置換された正規表現マッチの数を返します。0はマッチが見つからなかったことを意味します。この関数は`PCRE2_ERROR_NOMATCH`を返すことはありません。負の数はエラーが発生したことを示します。エラーメッセージを取得するには、`pcre2_get_error_message()`を呼び出します。バッファのサイズを保持する変数は、終端のゼロを除く、バッファに書き込まれた文字列の長さを示すように更新されます。(終端のゼロは書き込まれます。)

拡張置換文字列構文

バージョン10.21以降、PCRE2は`pcre2_substitute()`を呼び出す際にマッチングオプションに`PCRE2_SUBSTITUTE_EXTENDED`を含めることで有効にできる拡張置換文字列構文を提供します。最大の相違点は、バックスラッシュがもはやリテラルではないことです。文字または数字ではない文字に続くバックスラッシュはその文字をエスケープします。したがって、他のバックスラッシュを使用してドル記号とバックスラッシュをエスケープして、それらの特別な意味を抑制できます。置換文字列にリテラルのバックスラッシュを含めたい場合は、別のバックスラッシュでエスケープする必要があります。数字に続くバックスラッシュはエラーです。文字に続くバックスラッシュは、その組み合わせが置換文字列トークンを形成しない限りエラーです。

\a, \e, \f, \n, \r、および\tは、通常のASCII制御文字エスケープです。特に欠けているのは\bおよび\v. \x0から\xFおよび\x00から\xFFは16進エスケープです。\x{0}から\x{10FFFF}はUnicodeコードポイントを挿入します。\o{0}から\o{177777}は8進エスケープです。

大文字小文字の変換もサポートされています。構文はPerlと同じですが、動作は異なります。Perlでは\uまたは\l\Lまたは\Uと組み合わせることができます。1文字を大文字または小文字にし、残りを反対にすることができます。PCRE2では、大文字小文字の変換エスケープは前のエスケープを取り消します。そのため、それらを組み合わせることはできず、\uまたは\l\Uまたは\L.

条件式は、バックリファレンスの構文を拡張する新しく発明された構文を使用してサポートされています。${group:+一致:不一致}一致をグループが参加したときに挿入し、不一致を参加しなかったときに挿入します。他の条件式を含め、2つの代替案で完全な置換文字列構文を使用できます。

大文字小文字の変換は条件式を通過します。条件式の前に有効な大文字小文字の変換は、条件式にも適用されます。条件式に実際に使用される条件式の部分に独自のケース変換エスケープが含まれている場合、それらは条件式の後も有効なままです。したがって、${1:+\U:\L}${2}を使用して、最初のグループが参加した場合は大文字で、参加しなかった場合は小文字で、2番目のキャプチャグループに一致するテキストを挿入できます。

| クイックスタート | チュートリアル | ツールと言語 |  | リファレンス | 書評 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML スキーマ | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |