Подтвердить что ты не робот

Регулярные выражения 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, но я не знаю, как должен выглядеть мой шаблон. Я предполагаю, что $в шаблоне нужно заменить некоторыми escape-символами, но не знаю, сколько. Этот знак $важен для меня, так как он помогает мне различать элементы в списке (числа после доллара), и я не могу обойтись без него.

4b9b3361

Ответ 1

Вам нужно избежать $ в регулярном выражении с помощью обратного косая черта (\), но поскольку обратная косая черта - это escape-символ в строках, вам нужно избежать самой обратной косой черты.

Вам нужно будет избежать любого специального регулярного выражения char таким же образом, например, с помощью ".".

String pattern = "/feedback/com\\.navteq\\.lcms\\.common\\.domain\\.poi\\.feedback\\.Review\\$0(.)*";

Ответ 3

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

"/feedback/com\\.navtag\\.etc\\.Review\\$0(.*)"

(1 обратная косая черта - для строки Java, а 1 - для механизма регулярных выражений.)

Ответ 4

Побег доллара с помощью \

String pattern = 
  "/feedback/com.navteq.lcms.common.domain.poi.feedback.Review\\$0(.)*";

Я также советую вам избежать ., . представляет любой символ.

String pattern = 
  "/feedback/com\\.navteq\\.lcms\\.common\\.domain\\.poi\\.feedback\\.Review\\$0(.)*"; 

Ответ 5

Ответ @Colin Hebert и отредактированный @theon является правильным. Объяснение заключается в следующем. @Azec-рйх

  1. Это регулярное выражение в виде строкового литерала (в двойных кавычках).

  2. точка (.) и знак доллара ($) - это специальные символы регулярного выражения (метасимволы).

  3. Чтобы заставить механизм регулярных выражений интерпретировать их как обычные символы регулярного выражения (.) И знак доллара ($), необходимо добавить к каждой обратной косой черте. Единственная обратная косая черта (сама по себе специальный символ регулярного выражения) заключает в себе символ, следующий за ним и, таким образом, экранирующий его.

  4. Поскольку данное регулярное выражение является строковым литералом, перед каждым должен ставиться другой обратный слеш, чтобы избежать путаницы с обычными escape-символами ASCII (символьные, строковые и Unicode-экранированные в строковых литералах) и, таким образом, избежать ошибки компилятора.

  5. Даже если вы используете внутри строкового литерала любую специальную конструкцию регулярного выражения, которая была определена как escape-последовательность, она должна иметь префикс с другой обратной косой чертой, чтобы избежать ошибки компилятора. Например, специальная конструкция регулярного выражения (escape-последовательность)\b (word Граница) регулярного выражения будет конфликтовать с \b (backspace) обычного escape-ASCII (escape-символа). Таким образом, другой обратный слеш имеет префикс, чтобы избежать столкновения, и тогда \\b будет читаться регулярным выражением как граница слова.

  6. Чтобы быть всегда безопасным, все одиночные обратные слэши (кавычки) внутри строковых литералов имеют префикс другой обратной косой черты. Например, строковый литерал "\ (hello \)" недопустим и приводит к ошибке во время компиляции; чтобы соответствовать строке (привет), необходимо использовать строковый литерал "\\ (привет \\)".

  7. Последний период (.) * Должен интерпретироваться как специальный символ регулярного выражения, и поэтому он не нуждается в кавычках с обратной косой чертой, не говоря уже о префиксе второго.