注意:我必须简化我的实际用例,以备不时之需。所以如果你对这个问题的第一反应是:你为什么要这样做,相信我,我只需要。
我正在尝试编写一个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(“”,{expected
我认为这是因为我需要转义包含双引号字符(“”“)的字符串,但由于它是一个字符串内部的字符串,我不知道如何在此处正确地转义它。想法?提前感谢!
答案 0 :(得分:4)
您需要在此行的引号内转义引号:
String replacerExpression = "toReplace.replace(""", "'");";
字符串将被评估两次:一次作为字符串文字,一次作为脚本。这意味着你必须用反斜杠来逃避它,并且也逃避反斜杠。此外,使用嵌入式引号,如果使用三引号,它将更具可读性。
试试这个(在groovy中):
String replacerExpression = """toReplace.replace("\\"", "'");""";
在Java中,你不得不使用反斜杠来转义所有引号和嵌入的反斜杠:
String replacerExpression = "toReplace.replace(\"\\\"\", \"\'\");";
答案 1 :(得分: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 shell中进行评估:
toReplace.replace('"', "'");
如果眼睛太硬,请将上面的“关键线”换成另一种样式(使用粗俗的字符串):
String ESC_DOUBLE_QUOTE = /'"'/
String ESC_SINGLE_QUOTE = /"'"/
String replacerExpression = """toReplace.replace(${ESC_DOUBLE_QUOTE}, ${ESC_SINGLE_QUOTE});"""
答案 2 :(得分:0)
请尝试使用regular expressions来解决此类问题,而不是弄乱你的头来解决引用的问题。
我使用groovy控制台设置solution。请看看是否有帮助。