Как избежать косой черты в ограничении матчей
Как я могу избежать косой черты в регулярном выражении при использовании ограничения совпадений? Вот что я попробовал:
constraints {
url (
matches: "^http://www.google.com/$"
)
}
Ошибка: solution: either escape a literal dollar sign "\$5" or bracket the value expression "${5}"
constraints {
url (
matches: "^http:\/\/www.google.com\/$"
)
}
Ошибка: unexpected char: '\'
1 ответ
В строках, определенных двойными кавычками (".."
) groovy заменяет переменные на $
,
def var = "world"
def str = "hello $var" // "hello world"
В вашем регулярном выражении проверки это вызывает ошибку. Вы хотите использовать $
для регулярного выражения, а не для замены переменных. Чтобы избежать замены переменных, вы можете определять строки в одинарных кавычках ('..'
)
def str = 'hello $var' // "hello $var"
Вам не нужно убегать /
при определении регулярного выражения внутри строки, но вы должны избегать .
, В регулярном выражении .
соответствует любому персонажу. Так что регулярное выражение ^http://www.google.com/$
Матчи http://wwwAgoogleB.com/
,
Чтобы экранировать символ внутри строки, вы должны использовать \\
(первый \
для того, чтобы избежать второго \
). Таким образом, следующее выражение должно работать:
static constraints = {
name (
matches: '^http://www\\.google\\.com/$'
)
}
Обычно вы также можете использовать синтаксис Groovy регулярного выражения (/../
). В этом случае регулярное выражение будет выглядеть так
~/^http:\/\/www\.google\.com\/$/
Вам не нужны двойные обратные косые черты для экранирования, но, следовательно, вы должны избегать косые черты (потому что они используются для завершения регулярного выражения). Но, насколько мне известно, этот синтаксис не работает с ограничением совпадений из Grails.