2013-09-26 4 views
2

Примечание: Я должен был упростить свой фактический прецедент, чтобы избавить SO от множества предысторий. Поэтому, если ваша первая реакция на этот вопрос: , почему бы вам это сделать, поверьте мне, мне просто нужно.Двойное выскальзывание изнутри выражения Groovy

Я пытаюсь написать выражение 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

Вы должны избежать кавычки в кавычках в этой строке:

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

Строка будет оцениваться дважды: один раз как строковый литерал, и один раз в качестве сценария. Это означает, что вам нужно сбежать от него с помощью обратной косой черты и избежать обратной косой черты. Кроме того, со встроенными кавычками это будет гораздо более читаемым, если вы используете тройные кавычки.

Попробуйте это (в заводной):

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

В Java, вы застряли с помощью обратной косой черты, чтобы избежать всех цитат и встроенный обратный слэш:

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

Благодаря @ataylor (+1), но ваше предложение производит следующий компилятор rrors: 'Несколько маркеров на этой линии \t - Левая рука присваивания должна быть переменной \t - строка буквальной не правильно закрыт двойная кавычка \t - Ошибка синтаксиса, вставить выражение «AssignmentOperator Expression» для завершения Назначение \t - Ошибка синтаксиса, вставить «;» для завершения Заявление \t - Синтаксическая ошибка на токенах (ожидается вместо этого – IAmYourFaja

+0

@IAmYourFaja Второе решение использовать '' "" 'работает безупречно. Как вы запускаете скрипт? – dmahapatro

+0

О, я вижу. Внешний код - Java, я не обновил ответ, чтобы показать, как процитировать его на Java. – ataylor

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

Если это слишком трудно на глаз, заменить " ключевая строка "выше с другим стилем (с использованием slashy строк):

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

Спасибо @Michael Easter (+1), но ваше предложение (после того, как вы напишете «Рассмотрите это:» ...) выдает следующие ошибки компилятора : 'Несколько маркеров в этой строке \t - Неверная постоянная символа \t - Ошибка синтаксиса, вставить«; »для завершения LocalVariableDeclarationStatement' – IAmYourFaja

+0

Линия, ранее использовавшаяся после того, как« Рассматривать это »была предназначена для размещения в исходном скрипте. сообщение, чтобы полный пример был указан после «Conside r это ». –

0

Пожалуйста, попробуйте использовать regular expressions, чтобы решить такие проблемы, вместо того, чтобы испортить вам голову, чтобы справиться с побегом цитат.

Я установил solution с помощью гарнитуры. Посмотрите, поможет ли это.

Смежные вопросы