多字节字符串的正则表达式字边界

时间:2009-03-10 09:04:06

标签: regex unicode

我在我的搜索应用程序上使用posix c正则表达式库(regcomp / regexec)。我的应用程序支持不同的语言,包括使用多字节字符的语言。我在使用字边界元字符(\ b)时遇到了问题。 对于单字节字符串,它可以正常工作,例如:

“\ bpaper \ b”匹配“paper”

但是,如果正则表达式和查询字符串是多字节的,它似乎无法正常工作,例如:

“\ b纸张\ b”与“纸张”不匹配

我错过了什么吗?任何帮助都将受到高度赞赏。

请求信息:

  • 编程语言:C
  • 正则表达式库:GNU C(regex.h)

感谢。

3 个答案:

答案 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库,但原则也适用于其他人。