libc regcomp 和 regexec 中的多字节字符

multi-byte characters in libc regcomp and regexec

有没有办法让 libc6 的正则表达式函数 regcompregexec 正确处理多字节字符?

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

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

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

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

function Examp () {
  var uString = "猫机+猫+猫ymg+sah猫";
  var plussed = uString.replace(/(.)(?=[\+\*])/ig,"()");
  console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed);
  uString = "猫机+猫*猫ymg+s\a+I+h猫";
  plussed = uString.replace(/(\?.)(?=[\+\*])/ig,"()");
  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()" />

Is there a way to flag a pattern or string to match as containing utf8 characters?

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

至少,grep程序似乎考虑到了这一点,如所示;我还没有用 regcomp 函数测试过这个。

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

我提到的 post(以及 this one)建议您使用一些支持 unicode 的正则表达式库,例如 pcre。如果您有兴趣,pcre 提供了一个伪造的 posix 接口,并添加了一个非标准的 REG_UTF 标志。除了 #include 指令和在编译步骤添加 REG_UTF 之外,您不必重写代码。

希望这能满足您的需求。