1

タイプ「\uXXXX」の正規表現の出現箇所をすべて置き換えたいと考えています。ここで、「XXXX」は Unicode 文字を表す 16 進数で、対応する文字に置き換えます。

次の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 に答える