JavaTokenParsers
提供了方便的regexp,用于匹配整数和浮点数以及双引号字符串。但这就是它的全部。如何将这些字符串转换回底层转换对象这一显而易见的事情?对于数字来说,使用toDouble
或toInt
等非常容易。但是,如何对字符串执行等效操作?例如。如果我输入字符串
"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字符串?我无法相信没有库函数可以做到这一点,但找不到它。
答案 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)
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转义)中常见的转义序列:
\a
表示铃声(\007
),\e
表示ESC \UXXXXXXXX
用于UCS-4完整Unicode代码点(包括那些不在BMP中的代码点)\xXX
用于十六进制转义\cX
用于控制转义,例如\cH
= ^H
= \b
= \010
\0
表示NULL(\000
)