1

我想将所有出现的“\uXXXX”类型的正则表达式替换为相应的字符,其中“XXXX”是一个十六进制数字,表示 Unicode 字符。

我尝试了以下 Scala 代码:

def unscape(s : String) : String = {
 val rex = """\\u([0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z])""".r
 rex.replaceAllIn(s,m => {
     hex2str(m.group(1))
   }
}

def hex2str(s:String): String = {
  Integer.parseInt(s,16).toChar.toString  
}

如果我尝试,例如:

unscape("Hi\\u0024, \\u0024")

它给出了以下例外:

java.lang.StringIndexOutOfBoundsException: String index out of range: 1

另一个问题中,Java 对 Unicode 字符的处理似乎存在错误。那是问题吗?

4

2 回答 2

2

只是为了调整接受的答案:

  def unscape3(s: String): String = {
    val rex = """\\u(\p{XDigit}{4})""".r
    rex.replaceAllIn(s, m => Regex quoteReplacement hex2str(m group 1))
  }

  Console println unscape3("""Hi\u0024, \u0024""")

请注意,字符类是正确的,您不必知道使用quoteReplacement.

(可能比多次扫描替换文本更有效。)

于 2013-08-17T13:27:11.280 回答
1

尝试以下操作:

def unscape(s: String): String = {
    val rex = """\\u([0-9a-fA-F]{4})""".r
    rex.replaceAllIn(s, m => {
        hex2str(m.group(1))
            .replaceAllLiterally("\\", "\\\\")
            .replaceAllLiterally("$", "\\$")
    })
}

根据iternally使用的 Matcher.appendReplacement replaceAllIn

请注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可以被视为对捕获的子序列的引用,并且反斜杠用于转义替换字符串中的文字字符。

于 2013-08-17T07:05:58.573 回答