2

: SO のバックストーリーを省くために、実際のユース ケースを単純化する必要がありました。したがって、この質問に対する最初の反応が「なぜこれを行うのか」である場合、私を信じてください。

"文字列に現れる二重引用符 (" ") を単一引用符 (" ") に置き換える Groovy 式を作成しようとしています'

// BEFORE: Replace my "double" quotes with 'single' quotes.
String toReplace = "Replace my \"double-quotes\" with 'single' quotes.";

// Wrong: compiler error
String replacerExpression = "toReplace.replace(""", "'");";

Binding binding = new Binding();
binding.setVariable("toReplace", toReplace);
GroovyShell shell = new GroovyShell(binding);

// AFTER: Replace my 'double' quotes with 'single' quotes.
String replacedString = (String)shell.evaluate(replacerExpression);

問題は、割り当てた行でコンパイル エラーが発生することですreplacerExpression

トークン ""toReplace.replace("" の構文エラー、{予期される

二重引用符文字 (""") を含む文字列をエスケープする必要があるためだと思いますが、文字列内の文字列であるため、ここで適切にエスケープする方法がわかりません。アイデアはありますか?ありがとうあらかじめ!

4

3 に答える 3

1

三重引用符はうまく機能しますが、一重引用符で囲まれた文字列を使用して二重引用符を指定したり、二重引用符で囲まれた文字列で一重引用符を指定したりすることもできます。

このことを考慮:

String toReplace = "Replace my \"double-quotes\" with 'single' quotes." 

// key line:
String replacerExpression = """toReplace.replace('"', "'");"""

Binding binding = new Binding(); binding.setVariable("toReplace", toReplace)
GroovyShell shell = new GroovyShell(binding)

String replacedString = (String)shell.evaluate(replacerExpression)

つまり、文字列リテラルの評価の後、これは Groovy シェルで評価されます。

toReplace.replace('"', "'");

それが難しすぎる場合は、上記の「キーライン」を別のスタイルに置き換えます (スラッシュ文字列を使用):

String ESC_DOUBLE_QUOTE = /'"'/ 
String ESC_SINGLE_QUOTE = /"'"/ 
String replacerExpression = """toReplace.replace(${ESC_DOUBLE_QUOTE}, ${ESC_SINGLE_QUOTE});"""
于 2013-09-27T02:12:34.913 に答える
0

この種の問題を解決するには、頭を混乱させて引用符のエスケープに取り組むのではなく、正規表現を使用してみてください。

Groovy コンソールを使用してソリューションを作成しました。それが役立つかどうかを確認してください。

于 2013-10-04T23:09:15.897 に答える