4

JavaTokenParsersin Scala 提供了方便的正则表达式来匹配整数和浮点数,以及双引号字符串。但仅此而已。如何将这些字符串转换回底层转换对象?toDouble对于数字,使用or等​​很容易做到这一点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 字符串?我不敢相信没有库函数可以做到这一点,但找不到。

4

2 回答 2

2

似乎没有这样的函数——至少在 Scala 编译器中没有使用。不过,这不是一个决定性的答案,也许后来引入了一个库函数。

如果您想阅读(或复制粘贴)此代码,这是我找到的相关代码。Scala 编译器的标记化逻辑分布在不同的文件中。顶级方法似乎是fetchTokenin src/compiler/scala/tools/nsc/ast/parser/Scanners.scala,它又委托给逻辑 in src/compiler/scala/tools/nsc/util/CharArrayReader.scala(它的祖先之一),特别是nextCharand potentialUnicode。其他逃逸在 中处理getLitChar,再次在中处理Scanners.scala

于 2012-07-02T03:18:07.667 回答
0

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

如何在 Java 中取消转义 Java 字符串文字?

Tom Christiansen 提供了一些源代码来执行此操作。

我还发现 Apache Commons 具有执行此操作的功能:

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)
于 2012-07-03T03:38:45.230 回答