2

正規表現にGoogle re2ライブラリを使用していますが、結果を解析する方法がどこにも見つかりませんでした!

これは短い例です

bool b_matches ;
string s_teststr = " aaaaa flickr bbbb";
RE2 re("(?P<flickr>flickr)|(?P<flixster>flixster)");
assert(re.ok()); // compiled; if not, see re.error();
b_matches = RE2::FullMatch(s_teststr, re);

  b_matches = RE2::FullMatch(s_teststr, re);

// then,
re.NumberOfCapturingGroups() //-> always give me 2

 re.CapturingGroupNames(); //-> give me a map with id -> name (with 2 elements)

re.NamedCapturingGroups() //-> give me a map with name -> id (with 2 elements)

flickr のみが一致したことを知るにはどうすればよいですか?

ありがとうございました、

フランチェスコ

--- さらにテストを行った後、namedcapture の解決策が見つかりませんでした。抽出されたテキストを取得できる唯一の方法はこれです。

string s_teststr = "aaa  hello. crazy world bbb";
std::string word[margc];
RE2::Arg margv[margc];
RE2::Arg * margs[margc];
int match;
int i;

    for (i = 0; i < margc; i++) {
        margv[i] = &word[i];
        margs[i] = &margv[i];
    }
   string s_rematch = "((?P<a>hello\\.)(.*)(world))|(world)";
  match = RE2::PartialMatchN(s_teststr.c_str(), s_rematch.c_str(), margs, margc);
cout << "found res = " << match << endl;
  for (int i = 0; i < margc; i++) {
        cout << "arg[" << i << "] = " << word[i] << endl;
    }

-------- これにより、出力が得られます。

res = 1 arg[0] = こんにちは。クレイジーワールド arg[1] = こんにちは。arg[2] = クレイジー arg[3] = 世界 arg[4] =

一致する文字列の 2 番目の部分でテストするには...

string s_rematch = "((?P<a>hello\\.d)(.*)(world))|(world)";

--- 私は出力として取得します:

foudn res = 1 arg[0] = arg[1] = arg[2] = arg[3] = arg[4] = 世界

私の問題は、名前のキャプチャ-> a <---が出てこないことであり、出力をクリアする必要があります(区別されない一致の場合は小文字、追加された互換性のある文字から削除されます..)、マップに対して再度処理する必要があります。このプレグの値の代わりにキーを提供する名前付きキャプチャはありません

4

1 に答える 1

0

成功時に入力される文字列を渡すことができます。例えば:

std::string matchedValue;

if (RE2::FullMatch(s_teststr, re, &matchedValue))
{
    if (matchedValue.empty())
    {
        //not flickr
    }
}
else
{
    // matchedValue.empty() == true
}
于 2011-04-26T14:33:23.853 に答える