いろんなものはつながっている

C++で正規表現を使う(2)

対象の文字列に該当文字列がマッチするかの判定にひきつづき

search “AAA” “BBB” “CCC”

といった文字列から

“AAA”
“BBB”
“CCC”

という文字列を取り出すことを考えた。

もともともは、スペース区切りで分割して、、という処理をすればいいかなと思っていたが、文字列に空白が含まれるときは、意図とは異なるところで分割されてしまう。

例えば、
“AAA ” “A BC”
であると

“AAA

“A
BC”

と分割されてしまう。

これはいかんと思い正規表現で抽出することにした。(最初からそうすればよかったんだけど)

最初、パターンの正規表現を難しく考えすぎててうまくいかなかなったが、なんのことはない

.+?

でよかった。

#include "stdafx.h"
#include <string>
#include <tchar.h>
#include <regex>

typedef std::basic_string tstring;

using namespace std::tr1;

int GetMatchedStrings(const tstring& rTarget, const tstring& rPatternDef, vector<tstring>& MatchedStrings)
{
    basic_regex<TCHAR> Pattern(rPatternDef.c_str());
    match_results<tstring::const_iterator> Results;

    tstring::const_iterator ItrBegin = rTarget.begin();
    tstring::const_iterator ItrEnd = rTarget.end();

    unsigned int nMatchedNum = 0;
    while(regex_search(ItrBegin, ItrEnd, Results, Pattern)){
        MatchedStrings.push_back(tstring(Results.str()));
        ItrBegin = Results[0].second;
        nMatchedNum++;
    }

    return nMatchedNum;
}

int _tmain(int argc, _TCHAR* argv[])
{

    tstring Target = _T("search \"ABC\" \" D \" \"  CC\"");
    tstring PatternDef = _T("\".+?\"");

    vector<tstring> MatchedStrings;
    int MatchedNum = GetMatchedStrings(Target, PatternDef, MatchedStrings);

    return 0;

}

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク