是否需要让libc6的regexp函数regcomp和regexec与多字节字符一起正常工作?
例如,如果我的模式是utf8字符猫机+猫,那么在utf8编码的字符串猫机机机猫上找到匹配将失败,在那里它应该会成功。
我认为这是因为字符机的字节表示形式是\xe6\x9c\xba,而+是匹配一个或多个字节\xba的。我可以通过在模式中的每个多字节字符周围加上括号来使这个实例工作,但是由于这是一个应用程序,所以我不能要求用户这样做。
是否有方法将模式或字符串标记为包含utf8字符?也许告诉libc将模式存储为wchar而不是char?
发布于 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之外,您不必重写代码。
希望这能满足你的需要。
发布于 2015-02-21 09:02:22
你能用正则表达式来构建你的正则表达式吗?下面是一个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()" />
发布于 2016-11-26 23:35:38
是否有方法将模式或字符串标记为包含utf8字符?
我怀疑LC_CTYPE环境变量(或其他相关的地区设置)是 understand your encoding。
至少,grep程序似乎考虑到了这一点,如https://stackoverflow.com/a/40809461/94687中所示;我还没有用regcomp函数对其进行测试。
https://stackoverflow.com/questions/28115794
复制相似问题