Regex для экранирования специальных символов в Groovy - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь использовать регулярное выражение для выделения специальных символов, сейчас я использовал его на Java и работает отлично, он делает именно то, что я хочу Scape any special character однако я попробовал это в Groovy, но та же строка не работает, насколько я понял, это потому что $ зарезервировано в Groovy, пока я пробовал это;

Java: (делает работу)

String specialCharRegex = "[\\W|_]";
...
term = term.replaceAll(specialCharRegex, "\\\\$0");
...

Groovy:

ошибка

String specialCharRegex = "[\\W|_]";
...
term = term.replaceAll(specialCharRegex, "\\\\$0");
...

ошибка

String specialCharRegex = "[\\W|_]";
...
term = term.replaceAll(specialCharRegex, "\\\\\$0");
...

ошибка

String specialCharRegex = "[\\W|_]";
...
term = term.replaceAll(specialCharRegex, '\\\\$0');
...

ошибка

String specialCharRegex = "[\\W|_]";
...
term = term.replaceAll(specialCharRegex, '\\\\$1');
...

Я использую https://groovyconsole.appspot.com/ для проверки.

Вывод в Groovy должен быть:

Input: test 1& test
Output: test 1\& test

Input: test 1& test 2$
Output: test 1\& test 2\$

Input: test 1& test 2$ test 3%
Output: test 1\& test 2\$ test 3\%

Input: !"@#$%&/()=?
Output: \!\"\@\#\$\%\&\/\(\)\=\?

1 Ответ

0 голосов
/ 03 июля 2018

Обратите внимание, что [\W|_] = [\W_], поскольку | - это не слово char. Кроме того, рекомендуется определять регулярные выражения с косыми строками, поскольку обратные слеши внутри них обозначают буквальные обратные слэши, те, которые используются для формирования экранированных выражений .

Кажется, вы не хотите сопоставлять пробелы, поэтому вам нужно вычесть \s из [\W_], используйте /[\W_&&[^\s]]/ regex.

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

.replaceAll(specialCharRegex, '\\\\$0')

Иначе, экранируйте $ в строковом литерале в двойных кавычках:

.replaceAll(specialCharRegex, "\\\\\$0")

Косая строка также работает как положено:

.replaceAll(specialCharRegex, /\\$0/)

См. онлайн Groovy демо :

String specialCharRegex = /[\W_&&[^\s]]/;                                 
println('test 1& test'.replaceAll(specialCharRegex, '\\\\$0'));           // test 1\& test
println('test 1& test 2$'.replaceAll(specialCharRegex, "\\\\\$0"));       // test 1\& test 2\$
println('test 1& test 2$ test 3%'.replaceAll(specialCharRegex, /\\$0/));  // test 1\& test 2\$ test 3\%
println('!"@#$%&/()=?'.replaceAll(specialCharRegex, /\\$0/));             // \!\"\@\#\$\%\&\/\(\)\=\?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...