libc regcomp和regexec中的多字节字符

时间:2015-01-23 17:52:03

标签: regex utf-8 glibc libc multibyte-functions

有没有让libc6的正则表达式函数regcompregexec正常使用多字节字符?

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

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

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

3 个答案:

答案 0 :(得分:1)

你能使用正则表达式构建你的正则表达式吗?这是一个javascript示例,(虽然我知道你不使用js):

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);
}
<input type="button" value="Run" onclick="Examp()" />

答案 1 :(得分:1)

根据其手册页,glibc 理解 POSIX 正则表达式。 POSIX 正则表达式本身不支持 unicode。请参阅 this answer 以获取启发这一点的标准的摘录。这意味着您也可以忘记 UTF。这也意味着无论您处于何种语言环境,多字节字符都不适合。

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

希望这能满足您的需求。

答案 2 :(得分:0)

  

有没有办法将模式或字符串标记为包含utf8字符?

我怀疑LC_CTYPE环境变量(或其他相关的区域设置)是way to make regcomp/regexec understand your encoding

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