JFlex String Regex奇怪的行为

时间:2016-11-16 13:46:04

标签: regex unicode jflex

我正在尝试在JFlex中编写JSON字符串解析器,到目前为止我已经

string = \"((\\(\"|\\|\/|b|f|n|r|t|u[0-9a-fA-F]{4})) | [^\"\\])*\"

我认为抓住了规格(http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf)。 我已经在控制字符和标准字符和符号上测试了它,但由于某种原因它不接受£或(或)或¬。请有人能告诉我造成这种行为的原因吗?

1 个答案:

答案 0 :(得分:4)

也许你在JLex兼容模式下运行?如果是这样,请参阅官方JFlex用户手册中的以下内容。它似乎默认使用7位字符代码输入,而你想要的是16位(unicode)。

您可以通过在第一个%unicode之后添加第%%行来解决此问题。

输入字符集

%7bit

使生成的扫描仪使用7位输入字符集(字符代码0-127)。如果在运行时输入中遇到代码大于127的输入字符,则扫描程序将抛出ArrayIndexOutofBoundsException。不仅因为这个原因,您还应该考虑使用%unicode指令。有关字符编码的信息,另请参阅编码。这是JLex兼容模式的默认设置。

%full
%8bit

这两个选项都会使生成的扫描仪使用8位输入字符集(字符代码0-255)。如果在运行时输入中遇到代码大于255的输入字符,则扫描程序将抛出ArrayIndexOutofBoundsException。请注意,即使您的平台每个字符只使用一个字节,字符的Unicode值仍可能大于255.如果您正在扫描文本文件,则应考虑使用%unicode指令。有关字符编码的更多信息,另请参阅Econdings部分。

%unicode
%16bit

这两个选项都会导致生成的扫描程序使用完整的Unicode输入字符集,包括补充代码点:0-0x10FFFF。 %unicode并不意味着扫描程序一次读取两个字节。读取内容和构成角色的内容取决于运行时平台。有关字符编码的更多信息,另请参见编码部分。除非使用JLex兼容模式(命令行选项--jlex),否则这是默认值。