Webセミナー「「アンドキュメンテッド(?) VCL 」 2/4 ~逆引きVCL新機能」で、TRegExとboost::regexではメタ文字\wの動作が異なることが指摘されています。
boost::regexは全角文字にもマッチしますが、TRegExはマッチしません。
SkRegExpの動作も気になりますので、動作を確認しました。
結果は次のようになりました。
メタ文字 | 意味 | TRegEx | boost::regex | SkRegExp |
---|---|---|---|---|
\w | 単語構成文字 | × | ○ | ○ |
SkRegExpはboost::regexと同様に全角文字にマッチしました。
Delphiの人はSkRegExpを使っておけば間違いないと思います。
boost::regexの検証コード
#include <iostream>
#include <boost/regex.hpp>
boost::wregex re(L"(\\w+)");
std::wstring source = L"test TEST テスト";
boost::wsmatch match;
std::wstring::const_iterator start = source.begin();
std::wstring::const_iterator end = source.end();
while (boost::regex_search(start, end, match, re))
{
std::wcout << match[0].str() << std::endl;
start = match[0].second;
}
実行結果
test
TEST
テスト
TRegExの検証コード
#include <iostream>
#include <RegularExpressions.hpp>
TMatchCollection matches = TRegEx::Matches(L"test TEST テスト", L"(\\w+)");
for (int i = 0; i < matches.Count; ++i)
{
std::wcout << matches[i].Value.c_str() << std::endl;
}
実行結果
test
SkRegExpの検証コード
#include <iostream>
#include "SkRegularExpressions.hpp"
TMatchCollection matches = TRegEx::Matches(L"test TEST テスト", L"(\\w+)");
for (int i = 0; i < matches.Count; ++i)
{
std::wcout << matches[i].Value.c_str() << std::endl;
}
実行結果
test
TEST
テスト