Обратите внимание, что [\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/)); // \!\"\@\#\$\%\&\/\(\)\=\?