Java Regex - экранируйте все специальные символы регулярных выражений - PullRequest
0 голосов
/ 30 октября 2018

У меня есть много строк со специальными символами регулярных выражений. Примеры:

- Test1 + Test2 -> plus should not be a regex special character but a normal character

Существует ли метод регулярного выражения Java для экранирования всех специальных символов регулярного выражения?

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Это как избежать всех метасимволов регулярных выражений.

Фон:

  1. Если вам нужно преобразовать некоторый входной или динамический источник в регулярное выражение, то оно гарантировано
    что это 100% литерал.

  2. \Q .. \E используется, если у вас есть MIX литералов регулярных выражений и литералов, которые используют конструкции регулярных выражений через метасимволы.

    Пример: (?:\Q(?:dogs|cats)*\E)+
    Это будет соответствовать одному или нескольким буквам (?:dogs|cats)*

Есть и другие проблемы с \Q .. \E, такие как вложение и интерпретация
конечный результат избежал регулярного выражения. Это становится очень трудно отлаживать.

Итак, самое простое и безопасное - просто использовать String.replaceAll().

Пример Java:

 String src = "he,<>!!llo \\ + * ? [ ] ( ) { } | . ^ $ wo-r@l#d";
 System.out.println( src );
 src = src.replaceAll("([\\\\+*?\\[\\](){}|.^$])", "\\\\$1");
 System.out.println( src );

Выход:

he,<>!!llo \ + * ? [ ] ( ) { } | . ^ $ wo-r@l#d
he,<>!!llo \\ \+ \* \? \[ \] \( \) \{ \} \| \. \^ \$ wo-r@l#d
0 голосов
/ 06 июня 2019

для экранирования отдельных специальных символов, которые вы можете использовать \\

boolean b = Pattern.matches("\\- .* \\+ .*",  "- Test + Test"); // true
0 голосов
/ 31 октября 2018

Комментарии Совет лучше избегать его вручную, как правило, правильно - но если ваша входная строка «неизвестна», например, строка, которую пользователь может ввести, вы не можете этого сделать. Итак, если ваша строка является переменной, вы, скорее всего, ищете Pattern.quote: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote(java.lang.String)

String variableFromSomewhere="- Test1 + Test2";
String escapedString = Pattern.quote(variableFromSomewhere);

(Это не что иное, как использование \Q и \E, но требует меньше усилий при наборе текста и позволяет избежать проблем, если \Q и \E является частью самой входной строки.)

...