Регулярные выражения Java и знак доллара
У меня есть строка Java:
String b = "/feedback/com.school.edu.domain.feedback.Review$0/feedbackId");
Я также сгенерировал шаблон, с которым я хочу сопоставить эту строку:
String pattern = "/feedback/com.school.edu.domain.feedback.Review$0(.)*";
Когда я сказал b.matches(pattern)
это возвращается false
, Теперь я знаю, что знак доллара является частью Java RegEx, но я не знаю, как должен выглядеть мой шаблон. Я предполагаю, что $ in pattern должен быть заменен некоторыми управляющими символами, но не знаю, сколько. Этот знак $ важен для меня, поскольку он помогает мне различать элементы в списке (цифры за долларом), и я не могу обойтись без него.
4 ответа
Вам нужно сбежать $
в регулярном выражении с косой чертой (\
), но поскольку обратная косая черта является escape-символом в строках, вам необходимо избегать самой обратной косой черты.
Вам нужно будет экранировать любой специальный символ регулярного выражения таким же образом, например, с помощью ".".
String pattern = "/feedback/com\\.navteq\\.lcms\\.common\\.domain\\.poi\\.feedback\\.Review\\$0(.)*";
Использование
String escapedString = java.util.regex.Pattern.quote(myString)
автоматически экранировать все специальные символы регулярных выражений в данной строке.
В Java регулярное выражение обоих .
а также $
особенные. Вы должны избежать его с двумя обратными слешами, т.е.
"/feedback/com\\.navtag\\.etc\\.Review\\$0(.*)"
(1 обратный слеш для строки Java, а 1 для механизма регулярных выражений.)
Избежать доллара с \
String pattern =
"/feedback/com.navteq.lcms.common.domain.poi.feedback.Review\\$0(.)*";
Я советую вам сбежать .
также, .
представлять любой персонаж.
String pattern =
"/feedback/com\\.navteq\\.lcms\\.common\\.domain\\.poi\\.feedback\\.Review\\$0(.)*";
Ответ @Colin Hebert и отредактированный @theon верен. Объяснение таково. @azec-pdx
Это регулярное выражение в виде строкового литерала (в двойных кавычках).
точка (.) и знак доллара ($) - это специальные символы регулярного выражения (метасимволы).
Чтобы механизм регулярных выражений интерпретировал их как обычные периоды (.) И знак доллара ($) для регулярных выражений, вам необходимо поставить перед каждым из них одну обратную косую черту. Одиночный обратный слеш (сам по себе специальный символ регулярного выражения) помещает в кавычки следующий за ним символ и, таким образом, экранирует его.
Поскольку данное регулярное выражение является строковым литералом, перед каждым из них должен быть добавлен еще один обратный слеш, чтобы избежать путаницы с обычными escape-символами видимого ASCII (символы, строки и escape-последовательности Unicode в строковых литералах) и, таким образом, избежать ошибки компилятора.
Даже если вы используете в строковом литерале какую-либо специальную конструкцию регулярного выражения, которая была определена как escape-последовательность, она должна быть снабжена префиксом другой обратной косой черты, чтобы избежать ошибки компилятора. Например, специальная конструкция регулярного выражения (escape-последовательность) \b (word Граница) регулярного выражения будет конфликтовать с \ b(backspace) обычного escape-кода видимого ASCII (escape-символа). Таким образом, в качестве префикса добавляется другая обратная косая черта, чтобы избежать конфликта, и тогда \\b будет считываться регулярным выражением как граница слова.
Чтобы быть всегда в безопасности, все одиночные символы обратной косой черты (кавычки) в строковых литералах имеют префикс другой обратной косой черты. Например, строковый литерал "\(привет \)" является недопустимым и приводит к ошибке времени компиляции; чтобы соответствовать строке (привет), должен использоваться строковый литерал "\\(привет \\)".
Предполагается, что последняя точка (.)* Интерпретируется как специальный символ регулярного выражения и, следовательно, не требует цитирования обратной косой чертой, не говоря уже о добавлении второго префикса.