从Groovy表达式内部对正则表达式进行双转义

ha5z0ras  于 2022-11-01  发布在  其他
关注(0)|答案(3)|浏览(238)

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

我尝试编写一个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(“",{应为
我想这是因为我需要对包含双引号字符(“"”)的字符串进行转义,但由于它是字符串中的字符串,我不知道如何在这里正确地对它进行转义。

cngwdvgl

cngwdvgl1#

您需要对此行中引号内的引号进行转义:

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

该字符串将计算两次:一次作为字符串文字,一次作为脚本。这意味着你必须用反斜杠转义它,然后再转义反斜杠。另外,如果你使用三重引号,嵌入的引号会更容易阅读。
请尝试以下操作(在groovy中):

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

在Java中,您必须使用反斜杠来转义所有引号和嵌入式反斜杠:

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

q3qa4bjr2#

使用三引号效果很好,但也可以使用单引号字符串指定双引号,使用双引号字符串指定单引号。
请考虑以下内容:

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('"', "'");

如果这对眼睛来说太难了,用另一种风格(使用slashy字符串)替换上面的“关键行”:

String ESC_DOUBLE_QUOTE = /'"'/ 
String ESC_SINGLE_QUOTE = /"'"/ 
String replacerExpression = """toReplace.replace(${ESC_DOUBLE_QUOTE}, ${ESC_SINGLE_QUOTE});"""
np8igboo

np8igboo3#

请尝试使用regular expressions来解决这类问题,而不是为了解决引号的转义而绞尽脑汁。
我已经使用Groovy控制台建立了一个solution。请看看是否有帮助。

相关问题