2012-07-01 60 views
4

JavaTokenParsers Scala爲整數和浮點數以及雙引號字符串提供了方便的正則表達式。但這就是它的全部。我該如何做這些將這些字符串轉換回底層轉換對象的明顯事情?使用toDoubletoInt等等,這對數字來說很容易做到。但是,如何對字符串進行等價處理?例如。如果我輸入字符串如何解碼從Scala JavaTokenParsers的Unicode轉義等Java字符串到未轉義的字符串?

"Unicode \u20ac is a Euro sign, which I would write \\u20ac in a string. \243 is a pound sign.\n\r And \f is a \"form feed\", with embedded quotes.\n\r" 

然後我通過JavaTokenParsers運行此,我會及時得到一個字符串返回的是正確地解析了嵌入式報價,但有一個雙引號字符作爲第一個和最後一個字符,以及大量反斜槓序列。如何獲得處理轉義序列的等效Java字符串?我不能相信沒有庫函數來做到這一點,但無法找到它。

回答

2

似乎沒有這樣的功能 - 至少,沒有在Scala編譯器中使用。儘管如此,這還不是一個確鑿的答案,也許之後會引入一個庫函數。

如果你想閱讀(或複製粘貼)這段代碼,下面是我找到的相關代碼。 Scala編譯器的標記化邏輯分佈在不同的文件中。 最高級的方法似乎是fetchTokensrc/compiler/scala/tools/nsc/ast/parser/Scanners.scala中,它依次授予src/compiler/scala/tools/nsc/util/CharArrayReader.scala(其祖先之一)中的邏輯,特別是nextCharpotentialUnicode。其他轉義在getLitChar中處理,同樣在Scanners.scala中處理。

0

好的,我環顧了一下。計算器上的另一個問題似乎解決相關的問題:

How to unescape a Java string literal in Java?

有一些源代碼也從湯姆·克里斯汀森做到這一點。

我還發現,Apache的共同性有一個函數來做到這一點:

org.apache.commons3.lang.StringEscapeUtils.unescapeJava()

您需要使用Commons 3版本,如果你要處理的八進制轉義。通過Christiansen的上述版本具有在其處理其他地方看到公共轉義序列更多的功能(例如,Java正則表達式,Perl和Python逸出,C逸出)中不存在Java中:

  1. \a爲鍾(\007) ,\e爲ESC
  2. \UXXXXXXXX爲UCS-4完整的Unicode編碼點(包括那些未在BMP)
  3. \xXX十六進制逸出
  4. \cX爲控制轉義,例如\cH = ^H = \b = \010
  5. \0爲NULL(\000
相關問題