首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Unicode处理PCRE?

如何使用Unicode处理PCRE?
EN

Stack Overflow用户
提问于 2013-09-18 21:42:02
回答 2查看 1.1K关注 0票数 5

我正在使用VisualStudio2010通过PCRE进行一些正则表达式匹配。假设我在std::wstring中有一个模式和一个主题,如下所示:

代码语言:javascript
复制
std::wstring subject = L"サービス内容";
std::wstring pattern = L"ス内";

如你所见,我试图定位日语字符串,因此我需要使用PCRE的unicode变体,例如带有函数pcre16_execpcre32_exec的pcre16或pcre32等。

不幸的是,它不起作用。我的问题似乎是从wstring到无符号短整型或无符号整型的转换(取决于pcre16或pcre32)。我尝试了很多函数(wcstombs_s,使用QString进行字符串转换等)。但没有成功。exec函数的结果永远不会包含我期望的正确值。我不太确定哪里出了问题--使用简单的pcre函数与ansi字符串进行模式匹配工作得很好。下面是一段代码:

代码语言:javascript
复制
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模式的工作示例,或者解释一下哪里出了问题?我对自己感到恼火。

EN

回答 2

Stack Overflow用户

发布于 2013-09-18 23:14:12

我找到了解决方案here

关键是从wchar到const unsigned short (PCRE_SPTR16)的一个非常简单的转换。我的大脑一直在尝试使用更复杂的转换...简而言之,这是一个适用于任何可能感兴趣的人的工作示例。模式匹配的结果可以在subStrVec中找到:

代码语言:javascript
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2013-09-18 22:52:48

尝试使用c_strstd::wstrings转换为C字符串

代码语言:javascript
复制
const unsigned short *pattern = subjectstr.c_str();
const unsigned short *subject = patternstr.c_str();

另请注意,针对UTF-8、UTF-16和UTF-32的PCRE库有不同的版本。PCRE_UTF16标志仅适用于16位版本,反之亦然。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18873872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档