C++Builder XEでstd::regex・TRegEx・SkRegExpのメタ文字\wの動作を比較する

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
テスト

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください