CAtlRegExpを使用して置換処理を行いたいのですが、
Match後にどのように処理を行えばよいのかわかりません。
GetMatch関数を使用し
一致グループの先頭を指すように設定されたポインタや
一致グループの末尾を指すように設定されたポインタを
取得しても、どのようにして有効利用すればよいのかわかりません。
せめて、一致グループの先頭を指すように設定されたポインタが
何番目の文字なのかがわかれば置換処理ができそうな気がするのですが、
そのような関数も見当たりませんでした。
よろしくお願いします。
なにが問題なのか理解できません。
マッチした箇所のポインタが得られたなら、それから文字列先頭のポインタを引けば
マッチした箇所が何文字目であったかわかりますけど。
int _tmain(int argc, _TCHAR* argv[])
{
std::basic_string<TCHAR> str(_T(Hello World!));
std::basic_string<TCHAR> strRep(_T(Kitty));
LPCTSTR pstr = str.c_str();
CAtlRegExp<> re;
CAtlREMatchContext<> mc;
CAtlREMatchContext<>::MatchGroup mg;
if (re.Parse(_T({W[^!]*})) != REPARSE_ERROR_OK)
return 1;
if (!re.Match(pstr, &mc) || mc.m_uNumGroups == 0)
return 1;
mc.GetMatch(0, &mg);
str.replace(mg.szStart - pstr, mg.szEnd - mg.szStart, strRep);
_putts(str.c_str());
return 0;
}
#いまだにVC++6.0がメインなので CAtlRegExp なんて初めて知りました。
#便利そうですね。
マッチした箇所のポインタから、文字列先頭のポインタを引いて
何番目か調べることができました。
ありがとうございます。
話が少しずれますが、
今現在、altさんがやられているように置換にCStringを使用しているのですが、
置換用のクラスはないのでしょうか?
もう少し簡単にできる方法があるのか調査中です。
> 今現在、altさんがやられているように置換にCStringを使用しているのですが、
> 置換用のクラスはないのでしょうか?
std::stirng ではダメなの? なぜ?
boost::regex_replace()