2

注意:我不得不简化我的实际用例来节省大量的背景故事。所以如果你对这个问题的第一反应是:你为什么要这样做,相信我,我只需要这样做。

我正在尝试编写一个 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

4

您需要在此行的引号内转义引号:

String replacerExpression = "toReplace.replace(""", "'");";

该字符串将被评估两次:一次作为字符串文字,一次作为脚本。这意味着您必须用反斜杠转义它,并且也转义反斜杠。此外,使用嵌入式引号,如果您使用三引号,它将更具可读性。

试试这个(常规):

String replacerExpression = """toReplace.replace("\\"", "'");""";

在 Java 中,您一直使用反斜杠来转义所有引号和嵌入的反斜杠:

String replacerExpression = "toReplace.replace(\"\\\"\", \"\'\");";
于 2013-09-26T19:50:57.607 回答
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});"""
于 2013-09-27T02:12:34.913 回答
0

请尝试使用正则表达式来解决此类问题,而不是为了解决引号的转义而搞砸了。

我已经使用 groovy 控制台提出了一个解决方案。请看看这是否有帮助。

于 2013-10-04T23:09:15.897 回答