PCREの概要

4295 ワード

紹介する
PCRE(Perl Compatible Regular Expressions)は、C言語で記述された正規表現関数ライブラリです.PCREのコンパイルと使用方法について簡単に説明します.
コンパイル
PCRE公式サイトからダウンロードすると、解凍(本人の下のバージョンはpcre 2-10.21).READMEとNON-AUTOTOOLS-BUILDをよく読むと、多くのコンパイル方法が紹介されています.本人はVSで開発する必要があるので、CMakeコンパイルを選択します.1.VS開発者コマンドプロンプトを開き、CMakebinに切り替えて、cmake-gui.exeを実行します.2.ソースファイルディレクトリをPCREとする解凍ディレクトリを設定します.3.PCREでの解凍ディレクトリを設定します.ディレクトリの下にbuildフォルダを作成し、そのフォルダをコンパイルディレクトリに設定します.4.Configureボタンをクリックすると、コンパイラを選択するプロンプトボックスがポップアップされ、VSコンパイラのバージョンを選択し、Finishボタンをクリックします.5.構成が成功すると、構成リストにすべての構成項目が表示され、ここでは実際の必要に応じて変更されます.私はCMAKEだけを修正しました.INSTALL_PREFIX、すなわちインストールディレクトリ、その他はデフォルトのままです.コンフィギュレーション項目を変更した場合は、コンフィギュレーションを有効にするには、Configureを再度クリックする必要があります.6.Generateボタンをクリックすると、buildの下で必要なVSエンジニアリングファイルとソリューションファイルが生成されます.7.VSソリューションファイルを開き、ソリューション構成はReleaseバージョン、コンパイルエンジニアリングALL_BUILDでは、buildReleaseでライブラリファイルが生成されます.8.コンパイルエンジニアリングINSTALLは、CMAKE_INSTALL_PREFIXが指定したディレクトリの下にヘッダファイル、ライブラリファイル、および対応するマニュアルを生成します.sharedocの下にhtml形式のAPI説明ドキュメントが生成されます.
使用
  • エンジニアリングを構築する際に文字長を設定する必要があります.例えば、マクロPCRE 2_を定義します.CODE_UNIT_WIDTH=8
  • 静的ライブラリを使用する場合は、マクロPCRE 2_を定義する必要があります.STATIC
  • ここには簡単な使用説明のみが記載されており、具体的なAPI使用方法の詳細はAPI説明ドキュメントを参照してください.
  • #include "pcre2.h"
    #include 
    #include 
    
    int main(void)
    {
        const std::string pattern{ "\\d{3,5}" };
        int error_code = 0;
        PCRE2_SIZE error_offset = 0;
        pcre2_code *code = pcre2_compile(reinterpret_cast(pattern.c_str()), 
            PCRE2_ZERO_TERMINATED, 0, &error_code, &error_offset, NULL);
        if (code == NULL)
        {
            return -1;
        }
    
        const std::string subject{ "tel1:1234;tel2:3456;tel3:5678" };
        pcre2_match_data *match_data = pcre2_match_data_create_from_pattern(code, NULL);
        int rc = 0;
        int start_offset = 0;
        unsigned int match_index = 0;
        while ((rc = pcre2_match(code, 
            reinterpret_cast(subject.c_str()), subject.length(), 
            start_offset, 0, match_data, NULL)) > 0)
        {
            PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(match_data);
            int i = 0;
            for (i = 0; i < rc; i++)
            {
                std::cout << "match " << ++match_index << ": "
                    << std::string(subject.c_str() + ovector[2*i], ovector[2*i + 1] - ovector[2*i]) 
                    << std::endl;
            }
            start_offset = ovector[2*(i-1) + 1];
        }
    
        return 0;
    }