我在我的搜索应用程序上使用posix c正则表达式库(regcomp/regexec).我的应用程序支持不同的语言,包括使用多字节字符的语言.我在使用字边界元字符(\ b)时遇到了问题.对于单字节字符串,它工作得很好,例如:
"\ bpaper\b"匹配"纸"
但是,如果正则表达式和查询字符串是多字节的,它似乎无法正常工作,例如:
"\ b纸张\ b"与"纸张"不符
我错过了什么吗?任何帮助将受到高度赞赏.
请求的信息:
编程语言:C
正则表达式库:GNU C(regex.h)
谢谢.
如果正则表达式和查询字符串是多字节的,它似乎无法正常工作
在这种情况下什么是"多字节"?编码为UTF-8字节的字符串?特定于语言环境的多字节编码,例如GB?
如果您没有本地处理宽(Unicode)字符串,那么您不能指望对非ASCII字符的支持,而不仅仅是检测它们.POSIX正则表达式没有为ASCII范围之外的字节指定任何字符类,因此它不知道"\ xe7\xb4\x99"中的任何字节('纸'的UTF-8表示)都可以考虑字信件; 因此它没有看到任何字界.
Unicode中的字母或单词构成的问题比简单的ASCII正则表达式可以处理的问题更为复杂.(显然,用中文构成'单词'的内容本身就是可论证的.)如果你想要检测的只是普通的旧空间,你可以明确地做到这一点:
(\s|^)??(\s|$)