首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libc regcomp和regexec中的多字节字符

libc regcomp和regexec中的多字节字符
EN

Stack Overflow用户
提问于 2015-01-23 17:52:02
回答 3查看 733关注 0票数 8

是否需要让libc6的regexp函数regcompregexec与多字节字符一起正常工作?

例如,如果我的模式是utf8字符猫机+猫,那么在utf8编码的字符串猫机机机猫上找到匹配将失败,在那里它应该会成功。

我认为这是因为字符的字节表示形式是\xe6\x9c\xba,而+是匹配一个或多个字节\xba的。我可以通过在模式中的每个多字节字符周围加上括号来使这个实例工作,但是由于这是一个应用程序,所以我不能要求用户这样做。

是否有方法将模式或字符串标记为包含utf8字符?也许告诉libc将模式存储为wchar而不是char?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-28 14:56:49

根据其手册页,glibc理解POSIX regexp。POSIX regexp本身不支持unicode。有关启发这一点的标准的摘录,请参见this answer。这意味着你也可以忘记UTF。这也意味着无论您所处的地区环境如何,多字节字符都不适合。

我提到的帖子(以及this one)建议您使用一些与unicode相关的regexp库,例如pcre。如果您感兴趣,pcre提供了一个假的posix接口,并添加了一个非标准的REG_UTF标志。除了#include指令和编译步骤中添加的REG_UTF之外,您不必重写代码。

希望这能满足你的需要。

票数 1
EN

Stack Overflow用户

发布于 2015-02-21 09:02:22

你能用正则表达式来构建你的正则表达式吗?下面是一个javascript示例(虽然我知道您没有使用js):

代码语言:javascript
复制
function Examp () {
  var uString = "猫机+猫+猫ymg+sah猫";
  var plussed = uString.replace(/(.)(?=[\+\*])/ig,"($1)");
  console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed);
  uString = "猫机+猫*猫ymg+s\\a+I+h猫";
  plussed = uString.replace(/(\\?.)(?=[\+\*])/ig,"($1)");
  console.log("You can even take this a step further and account for a character being escaped, if that's a consideration.")
  console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed);
}
代码语言:javascript
复制
<input type="button" value="Run" onclick="Examp()" />

票数 1
EN

Stack Overflow用户

发布于 2016-11-26 23:35:38

是否有方法将模式或字符串标记为包含utf8字符?

我怀疑LC_CTYPE环境变量(或其他相关的地区设置)是 understand your encoding

至少,grep程序似乎考虑到了这一点,如https://stackoverflow.com/a/40809461/94687中所示;我还没有用regcomp函数对其进行测试。

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

https://stackoverflow.com/questions/28115794

复制
相关文章

相似问题

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