如何解码Java转义Java字符串从Scala JavaTokenParsers转换为未转义的字符串?

时间:2012-07-01 22:43:24

标签: parsing scala escaping decode unicode-escapes

Scala中的

JavaTokenParsers提供了方便的regexp,用于匹配整数和浮点数以及双引号字符串。但这就是它的全部。如何将这些字符串转换回底层转换对象这一显而易见的事情?对于数字来说,使用toDoubletoInt等非常容易。但是,如何对字符串执行等效操作?例如。如果我输入字符串

"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 个答案:

答案 0 :(得分:2)

似乎没有这样的功能 - 至少在Scala编译器中没有使用。这不是一个确凿的答案,可能之后引入了一个库函数。

如果您想要阅读(或复制粘贴)此代码,请参阅我找到的相关代码。 Scala编译器的标记化逻辑分布在不同的文件中。 src/compiler/scala/tools/nsc/ast/parser/Scanners.scala中的顶级方法似乎是fetchToken,后者又委托给src/compiler/scala/tools/nsc/util/CharArrayReader.scala(其中一个祖先)中的逻辑,特别是nextChar和{{1} }。其他转义在getLitChar处理,同样在potentialUnicode处理。

答案 1 :(得分:0)

好的,我看了一下。 stackoverflow的另一个问题似乎解决了一个相关的问题:

How to unescape a Java string literal in Java?

汤姆克里斯蒂安森有一些源代码可以做到这一点。

我还发现Apache Commons有这样的功能:

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

如果你想要处理八进制转义,你需要使用Commons 3版本。 Christiansen的上述版本具有更多功能,因为它处理Java中不存在的其他地方(例如Java regexps,Perl和Python转义,C转义)中常见的转义序列:

  1. \a表示铃声(\007),\e表示ESC
  2. \UXXXXXXXX用于UCS-4完整Unicode代码点(包括那些不在BMP中的代码点)
  3. \xXX用于十六进制转义
  4. \cX用于控制转义,例如\cH = ^H = \b = \010
  5. \0表示NULL(\000