2012-07-01 99 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
相关问题