クイックスタート
チュートリアル
ツールと言語
リファレンス
書籍レビュー
正規表現ツール
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 Schema
Xojo
XQuery と XPath
XRegExp
データベース
MySQL
Oracle
PostgreSQL
このサイトのその他の情報
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—The best regex editor and tester for PCRE users!

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

PCREはPerl Compatible Regular Expressions(Perl互換正規表現)の略です。これは、Philip Hazel氏によってC言語で書かれたオープンソースライブラリの名前です。このライブラリは、多くのCコンパイラとオペレーティングシステムと互換性があります。多くの人がPCREからライブラリを派生させて、他のプログラミング言語と互換性を持たせています。PHP (7.3.0以前)、DelphiR (4.0.0以前)、およびXojo (REALbasic)に含まれる正規表現機能はすべてPCREに基づいています。このライブラリは、多くのLinuxディストリビューションにも、共有.soライブラリと.hヘッダーファイルとして含まれています。

PCREはPerl互換であると主張していますが、現代のPerlとPCREのバージョン間には、それらを別個の正規表現フレーバーと見なすのに十分な違いがあります。Perlの最近のバージョンでは、Perlがそれらを持つ前にPCREが他のプログラミング言語からコピーした機能をPCREからコピーして、PerlをよりPCRE互換にする試みさえ行われています。今日、PCREはPerlよりも広く使用されています。なぜなら、PCREは非常に多くのライブラリとアプリケーションの一部だからです。

Philip Hazel氏は最近、PCRE2と呼ばれる新しいライブラリをリリースしました。最初のPCRE2リリースには、以前のPCRE 8.36との明確な区切りをつけるために、バージョン番号10.00が付けられました。今後のPCREリリースはバグ修正に限定されます。新機能はPCRE2のみに追加されます。新しい開発プロジェクトに取り組む場合は、PCREの代わりにPCRE2を使用することを検討する必要があります。ただし、既にPCREを使用している既存のプロジェクトの場合は、PCREを使い続けるのがおそらく最善です。PCREからPCRE2に移行するには、ソースコードに大きな変更を加える必要があります(ただし、正規表現には変更を加える必要はありません)。

PCREとPCRE2の詳細については、https://www.pcre.org/をご覧ください。

PCREの使用

PCREの使用は非常に簡単です。正規表現を使用する前に、効率を上げるためにバイナリ形式に変換する必要があります。これを行うには、正規表現をヌル終端文字列として渡してpcre_compile()を呼び出します。関数はバイナリ形式へのポインタを返します。結果に対しては、他のpcre関数に渡す以外に何もできません。

正規表現を使用するには、pcre_compile()によって返されたポインタ、検索対象の文字配列、および配列内の文字数(ヌル終端である必要はありません)を渡してpcre_exec()を呼び出します。また、pcre_exec()が結果を格納する整数配列へのポインタと、整数で表された配列の長さも渡す必要があります。配列の長さは、サポートするキャプチャグループの数に1(正規表現全体の一致分)を加えたものに3を掛けたものにする必要があります(!)。一致が見つからない場合、関数は-1を返します。それ以外の場合、埋められたキャプチャグループの数に1を加えた数を返します。配列に収まらないグループが daugiau の場合、0を返します。結果を含む配列の最初の2つの整数は、正規表現の一致の開始位置(配列の先頭からバイト数をカウント)と正規表現の一致のバイト数をそれぞれ含みます。後続の整数のペアは、後方参照の開始位置と長さを含みます。したがって、array[n*2]はキャプチャグループnの開始位置、array[n*2+1]はキャプチャグループnの長さであり、キャプチャグループ0は正規表現全体の一致です。

正規表現の使用が完了したら、pcre_compile()によって返されたポインタを使用してすべてのpcre_dispose()を呼び出して、メモリリークを防ぎます。

元のPCREライブラリは、正規表現のマッチングのみをサポートしており、それはかなりうまく機能します。文字列の検索と置換、文字列の分割などはサポートしていません。これは、独自のコードでこれらのことを簡単に行うことができるため、大きな問題ではないように思われるかもしれません。しかし、残念なことに、正規表現のマッチングにPCREを使用するすべてのプログラミング言語とライブラリは、独自の置換テキスト構文と、文字列を分割する際の独自の方法を持っています。新しいPCRE2ライブラリは、検索と置換をサポートしています。

Unicodeサポート付きでPCREをコンパイルする

デフォルトでは、PCREはUnicodeサポートなしでコンパイルされます。もしあなたが\p, \Pまたは\Xを正規表現で使用しようとすると、PCREはUnicodeサポートなしでコンパイルされたと文句を言います。

PCREをUnicodeサポート付きでコンパイルするには、SUPPORT_UTF8とSUPPORT_UCPの条件付き定義を定義する必要があります。PCREの構成スクリプトがシステムで動作する場合は、./configure --enable-unicode-propertiesを実行してからmakeを実行することで、簡単にこれを行うことができます。このWebサイトの正規表現チュートリアルでは、これらのオプションを使用してPCREをコンパイルし、他のすべてのオプションがデフォルトに設定されていることを前提としています。

PCREコールアウト

PCRE独自の機能は「コールアウト」です。もしあなたが(?C1)から(?C255)までを正規表現の任意の場所に配置すると、PCREは一致試行中にコールアウトに到達したときにpcre_callout関数を呼び出します。

UTF-8、UTF-16、およびUTF-32

デフォルトでは、PCREは8ビット文字列を処理し、各文字は1バイトです。PCRE_UTF8をpcre_compile()の2番目のパラメータとして渡すことで(バイナリまたはを使用して他のフレーバーと組み合わせることもできます)、PCREに正規表現をUTF-8文字列として解釈するように指示できます。これを行うと、pcre_match()は、対象の文字列もUTF-8を使用して自動的に解釈します。

PCRE 8.30以降を使用している場合は、--enable-pcre16configureスクリプトに渡してからmakeを実行することで、UTF-16サポートを有効にできます。その後、正規表現と対象の文字列がUTF-16として格納されている場合、PCRE_UTF16をpcre16_compile()に渡してから、pcre16_match()を使用してマッチングを行うことができます。UTF-16は、U+FFFFまでのコードポイントに2バイト、それ以上のコードポイントに4バイトを使用します。Visual C++では、wchar_t文字列はUTF-16を使用します。pcre_関数とpcre16_関数を混在させないようにすることが重要です。PCRE_UTF8とPCRE_UTF16の定数は実際には同じです。UTF-16バージョンを取得するには、pcre16_関数を使用する必要があります。

PCRE 8.32以降を使用している場合は、--enable-pcre32configureスクリプトに渡してからmakeを渡すことで、UTF-32サポートを有効にできます。その後、正規表現と対象の文字列がUTF-32として格納されている場合、PCRE_UTF32をpcre32_compile()に渡してから、pcre32_match()を使用してマッチングを行うことができます。UTF-32は文字ごとに4バイトを使用し、Linuxのメモリ内Unicode文字列によく使用されます。 pcre32_関数をpcre16_またはpcre_セットと混在させないようにすることが重要です。繰り返しますが、PCRE_UTF8とPCRE_UTF32の定数は同じです。UTF-32バージョンを取得するには、pcre32_関数を使用する必要があります。

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

| 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 Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |