PCRE

Perl Compatible Regular Expressions

種別正規表現
ライセンスBSD License
ウェブサイトhttp://www.pcre.org/

Perl Compatible Regular Expressions(PCRE)は、Perl互換の正規表現ライブラリである。

C言語サンプルコード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pcre.h>

int main()
{
  pcre *re;
  const char *errptr;
  int erroffset;
  int capture_count;
  int *matches;
  int n_matches;
  int offset = 0;

  const char *pattern = "a(b*)c";
  const char *source = "xiomfseabbBBbbcdegg";

  re = pcre_compile(pattern, PCRE_CASELESS, &errptr, &erroffset, NULL);
  if (re == NULL) {
    // コンパイルエラー時はNULLが返り
    // errptrに可読エラーメッセージ、erroffsetに場所(先頭からn文字目)が入る
    fprintf(stderr, "%s at %d\n", errptr, erroffset);
    exit(1);
  }

  // 結果を受け取る配列(matches)のサイズを計算する
  pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &capture_count);
  // 一時領域も含めて3倍必要らしい
  matches = malloc(sizeof(int) * (capture_count + 1) * 3);

  n_matches = pcre_exec(re, NULL, source, strlen(source), offset, 0, matches, (capture_count + 1) * 3);
  if (n_matches >= 0) {
    int i;
    for (i = 0; i < n_matches; i++) {
      int begin = matches[i * 2];
      int end = matches[i * 2 + 1];
      printf("(%d) : %.*s\n", i, end - begin, &source[begin]);
    }
  } else {
    // 見つからない場合は-1が返る
    printf("pattern not found\n");
  }

  return 0;
}

UTF-8サポート

UTF-8をサポートしているか確認

$ pcretest -C
PCRE version 7.5 2008-01-10
Compiled with
  UTF-8 support
  Unicode properties support
  Newline sequence is LF
  \R matches all Unicode newlines
  Internal link size = 2
  POSIX malloc threshold = 10
  Default match limit = 10000000
  Default recursion depth limit = 10000000
  Match recursion uses stack

UTF-8モードを有効にしてビルド

$ ./configure --enable-utf8 --enable-unicode-properties
$ make
# make install