2017-02-20 40 views
1

Я хотел исправить автоматически созданные сценарии Linux. Я использую функцию findAll(String, String) для изменения "$APP_ARGS" для чего-то другого.Как найти подстроку строки с двойными кавычками со знаком доллара в Groovy

я попытался варианты:

replaceAll('"$APP_ARGS"', 'simulators ' + '"\\\\$APP_ARGS"') - doesn't find 
replaceAll('\"\$APP_ARGS\"',... - doesn't find 
replaceAll('"\$APP_ARGS"',... - doesn't find 
replaceAll('\\"\\$APP_ARGS\\"',... - editor warning - excessive escape 
replaceAll('"\\\\$APP_ARGS"',... - doesn't find 
replaceAll('\\\\"\\\\$APP_ARGS\\\\"',... - doesn't find 
replaceAll($/"$$APP_ARGS"/$, ...) - does not find 
replaceAll('"[$]APP_ARGS"', 'something simple')  - finds. 
replaceAll('"[$]APP_ARGS"', '"\\\\$APP_ARGS"')  - fails. 

Как вы видите, если я использую формат регулярных выражений, вывод работает нормально. Но есть ли способ ускорить работу? Для этого мне нужна $ в заменяющей строке.

Согласно руководствам Groovy, строка /../ не требует экранирования ни для чего, кроме самих слэшей. Но

replaceAll(/"$APP_ARGS"/,... 

не удалось также с сообщением: Не удалось получить неизвестное свойство «APP_ARGS».

Похоже, что поведение этой функции не имеет логики, и мы должны найти правильное решение экспериментами.

+0

Вы сражаетесь с GStrings и RegExp сразу. Если вы используете только «replace», вы можете использовать строки с одним кавычком и не иметь дело с цитированием в regexp. например '' ls $ ARGS'.replace ('$ ARGS', "-l") ' – cfrick

+0

Я верил вам, если не та же проблема со вторым параметром, то есть чистой String. И первый параметр, BTW, также является строковым типом, а не шаблоном. Это то, о чем я говорю: первый параметр объявлен как String, но работает как шаблон - частично. Нет логики. – Gangnus

+0

Это не имеет ничего общего со вторым аргументом, если вы не пытаетесь что-то сделать, что неясно в моем вопросе. попробуйте '' ls "$ ARGS" '. replace (' "$ ARGS" ',' -l "$ ARGS" ') ', и если это не то, что вы ожидаете, пожалуйста, уточните. 'replaceAll' хочет, чтобы regexp был первым параметром (и превратит вашу строку в одну). – cfrick

ответ

1
replaceAll('"\\$APP_ARGS"', 'simulators ' + '"\\$APP_ARGS"') 

Дополнительная возможная проблема в том, что перед тем \\$ должны быть в обеих строках, замена и заменить.

Первый аргумент replaceAll всегда рассматривается как регулярное выражение, поэтому нам нужно указать $ (конец строки). Второй параметр может содержать обратные ссылки на группы из регулярного выражения, которые начинаются с $, так что нужно также процитировать.

Благородный способ заключается в использовании replace вместо replaceAll, который уже цитирует/ускоряет оба параметра в соответствии с этим использованием.