5

私はVisualStudio2010を使用して、PCREを介して正規表現のマッチングを行っています。std::wstring次のように指定されたパターンと件名があるとしましょう。

std::wstring subject = L"サービス内容";
std::wstring pattern = L"ス内";

pcre16_execご覧のとおり、日本語の文字列を見つけようとするため、pcre16やpcre32pcre32_execなどの関数を含む Unicode 版の PCRE を使用する必要があります。

残念ながら、うまくいきません。私の問題は、wstringunsigned short または unsigned int への変換のようです (pcre16 または pcre32 に依存)。多くの関数 (wcstombs_s、QString を使用した文字列変換など) を試しましたが、成功しませんでした。exec 関数の結果は、私が期待する正しい値を決して保持しません。何がうまくいかなかったのかよくわかりません - 単純な pcre 関数を使用した ansi 文字列とのパターン マッチングは正常に機能します。ここにスニペットがあります:

pcre16 *re;
const char *error;
int erroffset;
int ovector[30]; //The reult of the matching
int subject_length;
int rc;

std::wstring subjectstr = L"サービス内容";
std::wstring patternstr = L"ス内";
subject_length = 6;

const unsigned short pattern = ....// string conversion from patternstr
const insigned short subject = ....// string conversion from subjectstr

re = pcre16_compile(&pattern, PCRE_UTF16, &error, &erroffset, NULL);
rc = pcre16_exec(re, NULL, &subject, subject_length, 0, 0, ovector, 30);

PCRE を使用して Unicode パターンを検出する方法、または何が問題なのかを説明する方法について、誰かが私に実用的な例を教えてください。私は自分自身に憤慨します。

4

2 に答える 2

1

ここで解決策を見つけました。

キーは、wchar から const unsigned short (PCRE_SPTR16) への非常に単純なキャストでした。私の心は常に、より複雑な変換を使用しようとしてきました.... 一言で言えば、これは誰もが興味を持っているかもしれない実用的な例です. パターン マッチングの結果は、subStrVec で確認できます。

pcre16 *reCompiled;
int pcreExecRet;
int subStrVec[30];
const char *pcreErrorStr;
int pcreErrorOffset;  

std::wstring pattern = L"容内容";
std::wstring subject = L"容容容内容容容";

const wchar_t* aStrRegex = pattern.c_str();
const wchar_t* line = subject.c_str();

reCompiled = pcre16_compile((PCRE_SPTR16)aStrRegex, PCRE_UTF8, &pcreErrorStr, &pcreErrorOffset, NULL);
pcreExecRet = pcre16_exec(reCompiled, NULL, (PCRE_SPTR16)line, wcslen(line), 0, 0, subStrVec, 30);
于 2013-09-18T15:14:11.790 に答える