我想知道最新版本的flex是否支持unicode?
如果是这样,怎样才能使用模式来匹配汉字?
更多:
Use regular expression to match ANY Chinese character in utf-8 encoding
解决方法
目前,flex只生成8位扫描仪,这基本上限制了您使用UTF-8。所以如果你有一个模式:
肖晗 { printf ("xiaohan\n"); }
它将按预期工作,因为模式和输入中的字节序列将相同。字符类更困难。如果你想匹配字符肖或晗,你不能写:
[肖晗] { printf ("xiaohan/2\n"); }
因为这将匹配六个字节0xe8,0x82,0x96,0xe6,0x99和0x97中的每一个,这实际上意味着如果您提供肖晗作为输入,则模式将匹配六次。所以在这种简单的情况下,你必须将模式重写(肖|晗)。
对于范围,汉斯·阿伯格写了一个tool in Haskell,将其转换成8位模式:
Unicode> urToRegU8 0 0xFFFF [\0-\x7F]|[\xC2-\xDF][\x80-\xBF]|(\xE0[\xA0-\xBF]|[\xE1-\xEF][\x80-\xBF])[\x80-\xBF] Unicode> urToRegU32 0x00010000 0x001FFFFF \0[\x01-\x1F][\0-\xFF][\0-\xFF] Unicode> urToRegU32L 0x00010000 0x001FFFFF [\x01-\x1F][\0-\xFF][\0-\xFF]\0
这不漂亮,但它应该工作。