Groovyで 文字をエスケープする/エスケープを外す

「\」でエスケープする

文字列中の特定の文字をGroovyやC言語のように「\」でエスケープする
ここでは、「'」「"」「\」の3文字をエスケープする。

ソース
def quote_by_backslash(str){
    println str
    str.replaceAll(/['"\\]/){'\\' + it[0]}
}
println quote_by_backslash("1)abc'def\"ghi")
println quote_by_backslash("""2)abc'def\\\"ghi""")
println quote_by_backslash("""3)abc'def\"ghi""")
実行結果
1)abc'def"ghi
1)abc\'def\"ghi
2)abc'def\"ghi
2)abc\'def\\\"ghi
3)abc'def"ghi
3)abc\'def\"ghi

Groovyだと、quote_by_backslash(str)のstrに渡って時点で
「\」エスケープが外れてる点がRubyとは異なるようだ。

Rubyの場合だと
def quote_by_backslash(str)
    p str
    str.gsub(/['"\\]/){|ch| '\\' + ch}
end


str = "1)abc'def\"ghi"
p str
p quote_by_backslash(str)
実行結果
"1)abc'def\"ghi"
"1)abc'def\"ghi"
"1)abc\\'def\\\"ghi"

quote_by_backslash(str)で、「\」が外れてない。



「\」のエスケープを外す

ここでは、「'」「"」「\」の3文字のエスケープを外す

試行錯誤
def remove_backslash(str){
    println str
    str.replaceAll(/\\(.)/){it[0]}
}
println remove_backslash("4)abc\'def\\\"ghi")
println remove_backslash("""5)abc\'de\\\"ghi""")

これだと以下のエラーになってしまう。

Caught: groovy.lang.MissingMethodException: No signature of method: Q053_文字をエスケープする_エスケープを外す$_remove_backslash_closure2.doCall() is applicable for argument types: (java.lang.String, java.lang.String) values: [\", "]
        at Q053_文字をエスケープする_エスケープを外す.remove_backslash(Q053_文字をエスケープする_エスケープを外す.groovy:12)
        at Q053_文字をエスケープする_エスケープを外す.run(Q053_文字をエスケープする_エスケープを外す.groovy:14)


やりたことは、以下のRubyのコードをGroovyで書く場合。どうすればいいだろうか?

def remove_backslash(str)
    str.gsub(/\\(.)/){ $1 }
end
p remove_backslash("abc\'def\\\"ghi") #=> "abc'def\"ghi"

2007-10-10 君ならどう書く? s///ge
なんだ、Groovyでも$1ってそのまま使えるのか。

ソース

def remove_backslash(str){
    println str
    str.replaceAll(/\\(.)/,/$1/)
}
println remove_backslash("4)abc\'def\\\"ghi")
println remove_backslash("""5)abc\'de\\\"ghi""")
実行結果
4)abc'def\"ghi
4)abc'def"ghi
5)abc'de\"ghi
5)abc'de"ghi

文字を二重にしてエスケープする

ソース
def double_quote(str){
    println str
    str.replaceAll(/['"]/){it[0] + it[0] }
}
println double_quote("6)abc'def\"ghi")
実行結果
6)abc'def"ghi
6)abc''def""ghi

文字を二重にしたエスケープを外す

「\1」のグループ1への前方参照を使用する。

試行錯誤
def remove_doubled(str){
    println str
    str.replaceAll(/(['"])\1/,/$1/)
}
println remove_doubled("7)abc''def\"\"ghi")
7)abc''def""ghi
7)abc'def"ghi||<




**不可視文字を表示する
***ソース
>|groovy|

str = "8)a b \tc\r\n"

println str
println str.inspect()
実行結果
8)a b   c

"8)a b \tc\r\n"


不備指摘、こうした方がGroovyらしくないか?など添削歓迎
方法は、コメント、トラックバックTwitterなんでもいいです




実行環境






Groovyの詳細についてはJavadocと以下の書籍を参考にしている。




Dierk Konig、Andrew Glover、Paul King、、Guillaume Laforge、Jon Skeet、杉浦 孝、櫻井 正樹、須江 信洋、関谷 和愛、佐野 徹郎、寺沢 尚史

出品者からお求めいただけます。
価格は記載時点のものです。購入前にAmazonでご確認ください。




問題自体は第2版のもの。rubyと似てる部分も多いので、ヒントにもなる。
写経でもいいが自分で考えるために他言語の例をGroovyで置き換えてる。




青木 峰郎、後藤 裕蔵、高橋 征義、まつもと ゆきひろ

価格: ¥ 2,940
価格は記載時点のものです。購入前にAmazonでご確認ください。




Groovyイン・アクションを読むならあった方が便利かな。

Rubyレシピブックは「ほんたった」で立ててる