Scala String.replaceALL()置換''文字

3724 ワード

Sparkがテキストデータを一括処理する場合、'\'文字のテキストがあり、Json文字列をつづる際にJsonの"を誤って転義してしまうことがあり、Jsonの解析異常を招くため、'\'を削除する必要があり、まず次のような書き方を思いついた.
val str = """\   \"""

//   ,       !
str.replaceAll("""\""","")

その結果、次の異常が発生しました.
Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
 ^
    at java.util.regex.Pattern.error(Pattern.java:1924)
    at java.util.regex.Pattern.compile(Pattern.java:1671)
    at java.util.regex.Pattern.(Pattern.java:1337)
    at java.util.regex.Pattern.compile(Pattern.java:1022)
    at java.lang.String.replaceAll(String.java:2162)
    at com.neusoft.apps.Test$.main(Test.scala:37)
    at com.neusoft.apps.Test.main(Test.scala)

なぜなら、'\'は正規表現では依然として遷移文字であるが、"""\"""という表記は、Scalaではエスケープを必要とせずに'\'文字を表すがjavaである.util.regex.Patternでは、まだエスケープ文字として扱われていますが、エスケープ文字の後ろにエスケープする文字が付いていないので、エラーが表示されます.したがって、エスケープ記号'\''\'を加えて、もう一度エスケープを行うと文字'\'に相当します.
val str = """\   \"""
str.replaceAll("""\\""","")

または
val str = """\   \"""
str.replaceAll("\\\\","")

同じ理屈でStringでsplit()メソッドでもそうです.