【问题标题】:Determine if there is/are escape character(s) in string确定字符串中是否有转义字符
【发布时间】:2018-02-23 20:15:00
【问题描述】:

假设我有

String str="hello\" world\\";

打印str时,输出为

hello" world\

即使在打印 str.length() 时,输出也是

13

有什么方法可以证明str 值有转义字符?

【问题讨论】:

标签: java string escaping


【解决方案1】:

在运行时没有转义字符之类的东西。

转义字符仅出现在字符串文字中。例如,

String literal = "Some\nEscape\rSequence\\\"";

在编译时,编译器会生成一个 String 值及其实际二进制表示 (UTF-8iirc)。 JVM 直接使用 String 值。

你写的

我在想,每当我们打印一个字符串并且输出包含 "和\这样的字符,那么我们可以断定那些字符, " 并且\ 被转义了?

这不是真的,这些字符可能是从文件或其他一些InputStream 中读取的。它们绝对没有在文本文件中转义。

【讨论】:

  • 所以我们无法确定字符是否被转义?
  • @DnR 不在运行时,不。你为什么要这样做?
  • 没什么重要的。只是想表明hello" world\ 实际上是hello\" world\\
【解决方案2】:

是的。

使用 Apache Commons Library,特别是 StringEscapeUtils#escapeJava

jshell> StringEscapeUtils.escapeJava("Newline \n here \u0344 and unicode \f\n\r\t\"\0\13 and more")
$136 ==> "Newline \\n here \\u0344 and unicode \\f\\n\\r\\t\\\"\\u0000\\u000B and more"

这会为每个转义序列添加一个反斜杠,并将可变宽度的八进制序列交换为固定宽度的 Unicode 序列。这意味着每个转义序列将由 "\\" 两个反斜杠组成,后跟 {n, b, r, t, f, ", \}, 'u'字符之一,加上正好四个十六进制 [0-F] 数字。

如果您只想知道原始字符串是否包含转义序列,请在 Apache 字段中搜索“\\”。如果你想找到这些序列的位置,那就有点麻烦了。

this Gist查看更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2011-01-02
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多