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()
実行環境
- OS:Windows XP
- Groovy Version: 1.6.5
- JVM: 1.6.0_12
Groovyの詳細についてはJavadocと以下の書籍を参考にしている。
Dierk Konig、Andrew Glover、Paul King、、Guillaume Laforge、Jon Skeet、杉浦 孝、櫻井 正樹、須江 信洋、関谷 和愛、佐野 徹郎、寺沢 尚史
出品者からお求めいただけます。価格は記載時点のものです。購入前にAmazonでご確認ください。
問題自体は第2版のもの。rubyと似てる部分も多いので、ヒントにもなる。
写経でもいいが自分で考えるために他言語の例をGroovyで置き換えてる。
Groovyイン・アクションを読むならあった方が便利かな。