我在我的搜索应用程序上使用posix c正则表达式库(regcomp / regexec)。我的应用程序支持不同的语言,包括使用多字节字符的语言。我在使用字边界元字符(\ b)时遇到了问题。 对于单字节字符串,它可以正常工作,例如:
“\ bpaper \ b”匹配“paper”
但是,如果正则表达式和查询字符串是多字节的,它似乎无法正常工作,例如:
“\ b纸张\ b”与“纸张”不匹配
我错过了什么吗?任何帮助都将受到高度赞赏。
请求信息:
感谢。
答案 0 :(得分:6)
如果正则表达式和查询字符串是多字节的,它似乎无法正常工作
在这种情况下,什么是“多字节”?编码为UTF-8字节的字符串?特定于语言环境的多字节编码,例如GB?
如果您没有本地处理宽(Unicode)字符串,那么您不能指望对非ASCII字符的支持,而不仅仅是检测它们。 POSIX正则表达式没有为ASCII范围之外的字节指定任何字符类,因此它不知道“\ xe7 \ xb4 \ x99”中的任何字节('纸'的UTF-8表示)都可以考虑字信件;因此它没有看到任何字界限。
Unicode中的字母或单词构成的问题比简单的ASCII正则表达式可以解决的问题更为复杂。 (显然,用中文构成“单词”的内容本身就是有争议的。)如果你想要发现的只是普通的旧空间,你可以明确地做到这一点:
(\s|^)紙張(\s|$)
答案 1 :(得分:0)
我认为这取决于您使用的库/编程语言以及RegExp库的配置。可能您必须打开多字节支持,告诉库您正在使用哪种字符编码或相应地编辑区域设置。某些特殊操作(如\ b或\ w)取决于这些设置。
答案 2 :(得分:0)
有关Unicode和字边界的更多信息,请参阅this answer。给出的解决方案适用于PCRE库,但原则也适用于其他人。