从Groovy表达式中双重转义正则表达式

时间:2013-09-26 19:30:08

标签: regex string groovy escaping double-quotes

注意:我必须简化我的实际用例,以备不时之需。所以如果你对这个问题的第一反应是:你为什么要这样做,相信我,我只需要。

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

我认为这是因为我需要转义包含双引号字符(“”“)的字符串,但由于它是一个字符串内部的字符串,我不知道如何在此处正确地转义它。想法?提前感谢!

3 个答案:

答案 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。请看看是否有帮助。