2016-11-16 108 views
3

我試圖寫在JFlex的JSON字符串解析器,到目前爲止,我JFlex的字符串正則表達式奇怪的行爲

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

而且我認爲他拍攝的規格(http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf)。 我已經在控制字符和標準字符和符號上進行了測試,但由於某些原因它不接受英鎊或(或)或¬。請有人能讓我知道是什麼導致了這種行爲?

回答

4

也許你正在運行在JLex兼容模式?如果是這樣,請參閱官方JFlex用戶手冊中的以下內容。它似乎默認使用7位字符代碼輸入,而你想要的是16位(unicode)。

您可以通過在第一個%%之後添加行%unicode來解決此問題。

來源:

輸入字符集 %7位

導致所生成的掃描儀使用一個7位的輸入字符集(字符代碼0-127)。如果在運行時在輸入中遇到代碼大於127的輸入字符,則掃描器將引發ArrayIndexOutofBoundsException。不僅因爲這個原因,你應該考慮使用%unicode指令。有關字符編碼的信息,另請參閱編碼。這是JLex兼容模式的默認設置。

%滿 %8位

兩個選項導致生成的掃描器使用8位的輸入字符集(字符代碼0-255)。如果在運行時在輸入中遇到代碼大於255的輸入字符,則掃描器將引發ArrayIndexOutofBoundsException。請注意,即使您的平臺每個字符只使用一個字節,字符的Unicode值仍可能高於255.如果您正在掃描文本文件,則應考慮使用%unicode指令。有關字符編碼的更多信息,另請參閱經濟部分。

%的unicode %16位

兩個選項導致生成的掃描器使用完整的Unicode輸入字符集,包括補充代碼點:0-0x10FFFF。 %unicode並不意味着掃描程序一次只能讀取兩個字節。什麼是讀取和構成角色取決於運行時平臺。有關字符編碼的更多信息,另請參閱編碼部分。除非使用JLex兼容模式(命令行選項--jlex),否則這是默認值。

+1

爲了將來的參考,請將源代碼放在blockquotes中,以便將它們與您自己的寫作區分開來,並提供指向源代碼的超鏈接。 – Laurence