re 2正規表現マッチングエンジンのcインタフェースバージョンcre 2の中国語マニュアル
19405 ワード
前言
re 2公式住所:https://github.com/google/re2
cre 2公式アドレス:https://github.com/marcomaggi/cre2
1基本タイプ定義正規表現オブジェクトの不透明なタイプ.オブジェクトへのポインタを宣言します.このタイプのインスタンスは、任意の数のマッチング操作に使用でき、複数のスレッドの同時使用は安全です. は、別の文字列の一部を参照するための単純なデータ構造である. という分野がありますが返すエラーコードの列挙タイプ 2関数の使用は、PATTERN_を表す新しい正規表現オブジェクトを構築して返します.LENバイト長のPATTERN;このオブジェクトはOPTのオプションを設定します.メモリ割り当てに失敗した場合:戻り値は「NULL」ポインタです. は、関連するすべてのリソースを解放する正規表現オブジェクトを完了する. REXが正常に構築された正規表現オブジェクトかどうか:パターン文字列へのポインタを返します.返されるポインタは、REXがアクティブな場合にのみ有効です.'cre 2_delete()'がREXに適用されると、ポインタは無効になります. REXが正常に構築された正規表現オブジェクトである場合:モードで取得されたグループの数(カッコ式)を示す非負の整数を返します.REXの構築中にエラーが発生した場合:'-1'を返します. REXが正常に構築された正規表現オブジェクトの場合:NAMEという名前の名前の取得グループのインデックスを表す非負の整数を返します.REXの構築中にエラーまたは名前が無効な場合は、"-1"を返します.
3使用方法 REXが正常に構築された正規表現オブジェクトである場合:プログラムサイズを表す非負の整数を返し、正規表現「コスト」の非常に近似したメトリックである.大きな数字の小さい数字はもっと高いです.REXの構築中にエラーが発生した場合は、'-1'を返します. REX構築時にエラーが発生した場合:関連エラーコードを示す整数を返します.エラーがない場合は、ゼロ を返します. REX構築時にエラーが発生した場合:関連エラーメッセージを示すASCIIZ文字列へのポインタを返します.戻ってきたポインタは一意で、REXは有効です.「cre 2_delete()」をREXポインタに適用すると無効になります.
Demo REX構築時にエラーが発生した場合:ARG参照の構造をパターンの違反部分を示すバイト間隔で埋め込む.
demo
4マッチング構成オプションオブジェクトの不透明なポインタのタイプ.このタイプのインスタンスは、任意の数の正規表現オブジェクトを構成するために使用できます. 符号化定数の列挙タイプを選択する. が含まれていますは、新しいオプションオブジェクトを割り当てて返します.メモリ割り当てに失敗した場合:戻り値は「NULL」ポインタです. は、関連するすべてのリソースを解放するオプションオブジェクトを完了する.このオブジェクトでコンパイルを構成する正規表現は破壊されません.
次のすべての関数は、正規表現オプションのgetterとsetterです.setterのFLAGパラメータはfalseでなければ無効になりませんが、trueはtrueで有効になります.別途指定しない限り、このオプションが有効になっている場合、intはtrue、無効になっている場合falseを返します.のデフォルトでは、正規表現モードと入力テキストはUTF-8として解釈されます.CRE2_Latin 1符号化は、Latin−1として解釈される. void cre2_opt_set_posix_syntax(cre 2_options_t*OPT,int FLAG)はregexpをPOSIX egrep構文に制限します.デフォルトは無効です. は、最初の一致ではなく、最長の一致を検索します.既定では無効です.
-構文と実行エラーを「stderr」に記録します.既定値はオンです.は、正規表現ではなく、モード文字列を文字として解釈する.既定では無効です.
demoは、正規表現モードでも改行文字に一致しないでください.既定はオフです.このチェックボックスにチェックマークを付けると、サブモードを使用して正規表現モードの改行を除外せずに、複数行のテキストの先頭に対して部分的な一致を試行できます. 点は、新しい行を含むすべてのコンテンツに一致します.既定はオフです. すべてのカッコは非キャプチャとして解析されます.既定はオフです. は大文字と小文字を区別する.正規表現モードでは、POSIX構文モードで構成しない限り、'(?i)を使用してこの設定を上書きできます.デフォルト値は有効です. max memoryオプションは、正規表現とそのキャッシュDFA図のコンパイル形式を保存するためにどれだけのメモリを使用できるかを制御します.これらの関数は、このようなメモリ量を設定して取得します.詳細については、RE 2のドキュメントを参照してください. POSIX構文が有効になっている場合、次のオプションのみがクエリされます.POSIX構文が無効になっている場合:これらの機能は常に有効で、オフにできません.
POSIX構文が有効になっている場合、次のオプションのみがクエリされます.POSIX構文が無効になっている場合:これらの機能は常に有効で、オフにできません.は、Perlの'd','s','w','D','S','W'を許可する.既定はオフです. Perlの'b','B'(ワード境界ではなく)を許可します.デフォルトは無効です. モード'^'および'$'は、テキストの先頭と末尾にのみ一致します.既定はオフです.
5正規表現の一致
基本モードは次のように一致します.は、動作のアンカーポイントの列挙タイプに一致する. という定数が含まれています. TEXTが参照するテキストのサブ文字列に一致し、TEXT_を保持LENバイト対正規表現オブジェクトREX.テキストが一致するとtrueが返され、そうでない場合falseが返されます. と'cre 2_match()'は似ていますが、パターンはPATTERN_LENバイトを含む文字列PATTERNとして指定されています.また、アンカーする必要がなく、テキストが完全に一致しています. テキストマッチングモードの場合、戻り値は1、テキストがマッチングモードでない場合、戻り値は0、モードが非合法である場合、戻り値は2 である.構造タイプで、インデックスの開始と終了が一致するテキストを表すサブ文字列. というフィールドがあります.はSTRINGS配列を与え、ここでNMATCH要素は、TEXTを正規表現と一致させた結果である:RANGES配列をインデックス間隔で埋め込み、TEXTバッファで同じ結果を表す.
demo
結果:
≪インスタンス|Instance|emdw≫
次の例では、正常に一致しました.
次の例では、カッコのサブエクスプレッションを無視して一致しました.
次の例では、カッコ式に一致するテキスト部分がレポートされた一致に成功しました.は、ゼロ終端文字列PATTERNまたは完全バッファTEXTに対するプリコンパイル正規表現REXと一致する. はゼロ終端文字列PATTERNまたはバッファTEXTに対するプリコンパイル正規表現REXに一致し、TEXTのサブ文字列が一致すれば成功する.これらの関数の動作は完全に一致する関数に似ていますが、一致するテキストは先頭と末尾にアンカーする必要はありません. は、0で終わる文字列PATTERNまたはバッファTEXTに対するプリコンパイル正規表現REXに一致し、TEXTのプレフィックスが一致すると成功する.TEXT参照のデータ構造は、パターンに一致する最後のバイトの直後に参照テキストとなる. は、ゼロで終わる文字列PATTERNまたはバッファTEXTに対するプリコンパイル正規表現REXと一致し、TEXTの非一致接頭辞をスキップした後、TEXTのサブ文字列が一致すると成功する.TEXT参照のデータ構造は、パターンに一致する最後のバイトの直後に参照テキストとなる. 文字列マッチングモードに適合する文字列を対応する文字列 に置き換える.
グローバル置換もサポート
re 2公式住所:https://github.com/google/re2
cre 2公式アドレス:https://github.com/marcomaggi/cre2
1基本タイプ定義
:cre2_regexp_t
Struct Typedef:cre2_string_t
'const char * data'
Pointer to the first byte in the referenced substring.
'int length'
The number of bytes in the referenced substring.
Enumeration Typedef: cre2_error_code_t
:cre2_regexp_t * cre2_new(const char * PATTERN,int
PATTERN_LEN,const cre2_options_t * OPT)
void cre2_delete(cre2_regexp_t * REX)
const char * cre2_pattern(const cre2_regexp_t * REX)
int cre2_num_capturing_groups(const cre2_regexp_t * REX)
int cre2_find_named_capturing_groups(const cre2_regexp_t
* REX,const char * NAME)
3使用方法
const char * pattern = "from (?P.*) to (?P.*)";
cre2_options_t * opt = cre2_opt_new();
cre2_regexp_t * rex = cre2_new(pattern, strlen(pattern),
opt);
{
if (cre2_error_code(rex))
{ /* handle the error */ }
int nmatch = cre2_num_capturing_groups(rex) + 1;
cre2_string_t strings[nmatch];
int e, SIndex, DIndex;
const char * text = \
"from Montreal, Canada to Lausanne, Switzerland";
int text_len = strlen(text);
e = cre2_match(rex, text, text_len, 0, text_len,
CRE2_UNANCHORED, strings, nmatch);
if (0 == e)
{ /* handle the error */ }
SIndex = cre2_find_named_capturing_groups(rex, "S");
if (0 != strncmp("Montreal, Canada",
strings[SIndex].data, strings[SIndex].length))
{ /* handle the error */ }
DIndex = cre2_find_named_capturing_groups(rex, "D");
if (0 != strncmp("Lausanne, Switzerland",
strings[DIndex].data, strings[DIndex].length))
{ /* handle the error */ }
}
cre2_delete(rex);
cre2_opt_delete(opt);
int cre2_program_size(const cre2_regexp_t * REX)
int cre2_error_code(const cre2_regexp_t * REX)
const char * cre2_error_string(const cre2_regexp_t * REX)
Demo
If REX is a successfully built regular expression object: return a
pointer to an empty string.
The following code:
cre2_regexp_t * rex;
rex = cre2_new("ci(ao", 5, NULL);
{
printf("error: code=%d, msg=\"%s\"
",
cre2_error_code(rex),
cre2_error_string(rex));
}
cre2_delete(rex);
prints:
error: code=6, msg="missing ): ci(ao"
void cre2_error_arg(const cre2_regexp_t * REX,
cre2_string_t * ARG)
demo
If REX is a successfully built regular expression object: ARG
references an empty string.
The following code:
cre2_regexp_t * rex;
cre2_string_t S;
rex = cre2_new("ci(ao", 5, NULL);
{
cre2_error_arg(rex, &S);
printf("arg: len=%d, data=\"%s\"
", S.length, S.data);
}
cre2_delete(rex);
prints:
arg: len=5 data="ci(ao"
4マッチング構成
cre2_options_t * opt;
opt = cre2_opt_new();
cre2_opt_set_log_errors(opt, 0);
Opaque Typedef:cre2_options_t
Enumeration Typedef:cre2_encoding_t
CRE2_UNKNOWN
CRE2_UTF8
CRE2_Latin1
The value 'CRE2_UNKNOWN' should never be used: it exists only in
case there is a mismatch between the definitions of RE2 and CRE2.
cre2_options_t * cre2_opt_new(void)
Function:void cre2_opt_delete(cre2_options_t * OPT)
次のすべての関数は、正規表現オプションのgetterとsetterです.setterのFLAGパラメータはfalseでなければ無効になりませんが、trueはtrueで有効になります.別途指定しない限り、このオプションが有効になっている場合、intはtrue、無効になっている場合falseを返します.
void cre2_opt_set_encoding(cre2_options_t * OPT,
cre2_encoding_t ENC)
int cre2_opt_posix_syntax(cre2_options_t * OPT)
void cre2_opt_set_posix_syntax(cre2_options_t * OPT,int
FLAG)
- :int cre2_opt_longest_match(cre2_options_t * OPT)
- :void cre2_opt_set_longest_match(cre2_options_t * OPT,int
FLAG)
- Function:int cre2_opt_log_errors(cre2_options_t * OPT)
- :void cre2_opt_set_log_errors(cre2_options_t * OPT,int
FLAG)
-構文と実行エラーを「stderr」に記録します.既定値はオンです.
Function:int cre2_opt_literal(cre2_options_t * OPT)
void cre2_opt_set_literal(cre2_options_t * OPT,int FLAG)
demo
Setting this option is equivalent to quoting all the special
characters defining a regular expression pattern:
cre2_regexp_t * rex;
cre2_options_t * opt;
const char * pattern = "(ciao) (hello)";
const char * text = pattern;
int len = strlen(pattern);
opt = cre2_opt_new();
cre2_opt_set_literal(opt, 1);
rex = cre2_new(pattern, len, opt);
{
/* successful match */
cre2_match(rex, text, len, 0, len,
CRE2_UNANCHORED, NULL, 0);
}
cre2_delete(rex);
cre2_opt_delete(opt);
Function:int cre2_opt_never_nl(cre2_options_t * OPT)
void cre2_opt_set_never_nl(cre2_options_t * OPT,int
FLAG)
int cre2_opt_dot_nl(cre2_options_t * OPT)
void cre2_opt_set_dot_nl(cre2_options_t * OPT,int FLAG)
Function:int cre2_opt_never_capture(cre2_options_t * OPT)
void cre2_opt_set_never_capture(cre2_options_t * OPT,int
FLAG)
Function:int cre2_opt_case_sensitive(cre2_options_t * OPT)
void cre2_opt_set_case_sensitive(cre2_options_t * OPT,
int FLAG)
Function:int cre2_opt_max_mem(cre2_options_t * OPT)
void cre2_opt_set_max_mem(cre2_options_t * OPT,int M)
POSIX構文が有効になっている場合、次のオプションのみがクエリされます.POSIX構文が無効になっている場合:これらの機能は常に有効で、オフにできません.
Function:int cre2_opt_perl_classes(cre2_options_t * OPT)
void cre2_opt_set_perl_classes(cre2_options_t * OPT,int
FLAG)
int cre2_opt_word_boundary(cre2_options_t * OPT)
void cre2_opt_set_word_boundary(cre2_options_t * OPT,int
FLAG)
int cre2_opt_one_line (cre2_options_t * OPT)
void cre2_opt_set_one_line (cre2_options_t * OPT, int
FLAG)
5正規表現の一致
基本モードは次のように一致します.
cre2_regexp_t * rex;
cre2_options_t * opt;
const char * pattern = "(ciao) (hello)";
opt = cre2_opt_new();
cre2_opt_set_posix_syntax(opt, 1);
rex = cre2_new(pattern, strlen(pattern), opt);
{
const char * text = "ciao hello";
int text_len = strlen(text);
int nmatch = 3;
cre2_string_t match[nmatch];
cre2_match(rex, text, text_len, 0, text_len, CRE2_UNANCHORED,
match, nmatch);
/* prints: full match: ciao hello */
printf("full match: ");
fwrite(match[0].data, match[0].length, 1, stdout);
printf("
");
/* prints: first group: ciao */
printf("first group: ");
fwrite(match[1].data, match[1].length, 1, stdout);
printf("
");
/* prints: second group: hello */
printf("second group: ");
fwrite(match[2].data, match[2].length, 1, stdout);
printf("
");
}
cre2_delete(rex);
cre2_opt_delete(opt);
- Enumeration Typedef:cre2_anchor_t
CRE2_UNANCHORED
CRE2_ANCHOR_START
CRE2_ANCHOR_BOTH
int cre2_match(const cre2_regexp_t * REX,const char *
TEXT,int TEXT_LEN,int START_POS,int END_POS,cre2_anchor_t
ANCHOR,cre2_string_t * MATCH,int NMATCH)
The zero-based indices START_POS (inclusive) and END_POS
(exclusive) select the substring of TEXT to be examined. ANCHOR
selects the anchor point for the matching operation.
Data about the matching groups is stored in the array MATCH, which
must have at least NMATCH entries; the referenced substrings are
portions of the TEXT buffer. If we are only interested in
verifying if the text matches or not (ignoring the matching
portions of text): we can use 'NULL' as MATCH argument and 0 as
NMATCH argument.
The first element of MATCH (index 0) references the full portion of
the substring of TEXT matching the pattern; the second element of
MATCH (index 1) references the portion of text matching the first
parenthetical subexpression, the third element of MATCH (index 2)
references the portion of text matching the second parenthetical
subexpression; and so on.
int cre2_easy_match(const char * PATTERN,int
PATTERN_LEN,const char * TEXT,int TEXT_LEN,cre2_string_t *
MATCH,int NMATCH)
Struct Typedef:cre2_range_t
'long start'
Inclusive start byte index.
'long past'
Exclusive end byte index.
void cre2_strings_to_ranges(const char * TEXT,
cre2_range_t * RANGES,cre2_string_t * STRINGS,int NMATCH)
demo
cre2_regexp_t * rex;
cre2_options_t * opt;
const char * pattern;
pattern = "(ciao) (hello)";
opt = cre2_opt_new();
rex = cre2_new(pattern, strlen(pattern), opt);
{
if (cre2_error_code(rex))
printf("rex error
");
int nmatch = 3;
cre2_string_t strings[nmatch];
cre2_range_t ranges[nmatch];
int e;
const char * text = "ciao hello";
int text_len = strlen(text);
e = cre2_match(rex, text, text_len, 0, text_len, CRE2_UNANCHORED, strings, nmatch);
if (1 != e)
printf("match error
");
cre2_strings_to_ranges(text, ranges, strings, nmatch);
printf("full match: ");
printf("%.*s
", ranges[0].past-ranges[0].start,text+ranges[0].start);
printf("
");
printf("first group: ");
printf("%.*s
", ranges[1].past-ranges[1].start,text+ranges[1].start);
printf("
");
printf("second group: ");
printf("%.*s
", ranges[2].past-ranges[2].start,text+ranges[2].start);
printf("
");
}
cre2_delete(rex);
cre2_opt_delete(opt);
結果:
full match: ciao hello
first group: ciao
second group: hello
≪インスタンス|Instance|emdw≫
次の例では、正常に一致しました.
const char * pattern = "ci.*ut";
const char * text = "ciao salut";
cre2_string_t input = {
.data = text,
.length = strlen(text)
};
int result;
result = cre2_full_match(pattern, &input, NULL, 0);
result => 1
次の例では、カッコのサブエクスプレッションを無視して一致しました.
const char * pattern = "(ciao) salut";
const char * text = "ciao salut";
cre2_string_t input = {
.data = text,
.length = strlen(text)
};
int result;
result = cre2_full_match(pattern, &input, NULL, 0);
result => 1
次の例では、カッコ式に一致するテキスト部分がレポートされた一致に成功しました.
const char * pattern = "(ciao) salut";
const char * text = "ciao salut";
cre2_string_t input = {
.data = text,
.length = strlen(text)
};
int nmatch = 1;
cre2_string_t match[nmatch];
int result;
result = cre2_full_match(pattern, &input, match, nmatch);
result => 1
strncmp(text, input.data, input.length) => 0
strncmp("ciao", match[0].data, match[0].length) => 0
1. int cre2_full_match(const char * PATTERN,const
cre2_string_t * TEXT,cre2_string_t * MATCH,int NMATCH)
2. int cre2_full_match_re(cre2_regexp_t * REX,const
cre2_string_t * TEXT,cre2_string_t * MATCH,int NMATCH)
For example: the text 'abcdef' matches the pattern 'abcdef'
according to this function, but neither the pattern 'abc' nor the
pattern 'def' will match.
int cre2_partial_match(const char * PATTERN,const
cre2_string_t * TEXT,cre2_string_t * MATCH,int NMATCH)
int cre2_partial_match_re(cre2_regexp_t * REX,const
cre2_string_t * TEXT,cre2_string_t * MATCH,int NMATCH)
For example: the text 'abcDEFghi' matches the pattern 'DEF'
according to this function.
int cre2_consume(const char * PATTERN,cre2_string_t *
TEXT,cre2_string_t * MATCH,int NMATCH)
int cre2_consume_re(cre2_regexp_t * REX,cre2_string_t *
TEXT,cre2_string_t * MATCH,int NMATCH)
For example: the text 'abcDEF' matches the pattern 'abc' according
to this function; after the call TEXT will reference the text
'DEF'.
int cre2_find_and_consume(const char * PATTERN,
cre2_string_t * TEXT,cre2_string_t * MATCH,int NMATCH)
int cre2_find_and_consume_re(cre2_regexp_t * REX,
cre2_string_t * TEXT,cre2_string_t * MATCH,int NMATCH)
For example: the text 'abcDEFghi' matches the pattern 'DEF'
according to this function; the prefix 'abc' is skipped; after the
call TEXT will reference the text 'ghi'.
cre2_replace_re(cre2_regexp_t * REX,
cre2_string_t * TEXT,cre2_string_t * replace)
cre2_regexp_t * rex;
const char * pattern = "hello";
const char * text = "ciao hello salut";
const char * replace = "ohayo";
cre2_string_t target = {
.data = text,
.length = strlen(text)
};
cre2_string_t rewrite = {
.data = replace,
.length = strlen(replace)
};
int result;
rex = cre2_new(pattern, strlen(pattern), NULL);
{
result = cre2_replace_re(rex, &target, &rewrite);
if (1 != result)
goto error;
if (0 != strncmp("ciao ohayo salut", target.data, target.length))
goto error;
if ('\0' != target.data[target.length])
goto error;
PRINTF("rewritten to: ");
FWRITE(target.data, target.length, 1);
PRINTF("
");
}
cre2_delete(rex);
free((void *)target.data);
グローバル置換もサポート
cre2_regexp_t * rex;
const char * pattern = "( | | | | | | | | | | | | | | | )";
const char * text = "ciao salut ";
const char * replace = "sty";
cre2_string_t target = {
.data = text,
.length = strlen(text)
};
cre2_string_t rewrite = {
.data = replace,
.length = strlen(replace)
};
int result;
rex = cre2_new(pattern, strlen(pattern), NULL);
{
result = cre2_global_replace_re(rex, &target, &rewrite);
printf("result is %d
", result);
if (1 != result)
printf("replace error
");
if (0 != strncmp("ciao sty salut sty", target.data, target.length))
printf("cmp error
");
if ('\0' != target.data[target.length])
printf("target error
");
printf("rewritten to: ");
printf("%.*s
", target.length, target.data);
printf("
");
}
cre2_delete(rex);
free((void *)target.data);