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

java regex special-characters

1450 просмотра

3 ответа

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

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

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

Автор: quma Источник Размещён: 12.11.2019 09:28

Ответы (3)


1 плюс

Решение

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

boolean b = Pattern.matches("\\- .* \\+ .*",  "- Test + Test"); // true
Автор: zemiak Размещён: 06.06.2019 06:26

2 плюса

Комментарии Как правило, лучше избегать этого вручную, но если ваша строка ввода «неизвестна», например, строка, которую пользователь может ввести, вы не сможете этого сделать. Итак, если ваша строка является переменной, вы, скорее всего, ищете 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является частью самой входной строки.)

Автор: dognose Размещён: 30.10.2018 09:13

1 плюс

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

Фон:

  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
Автор: user557597 Размещён: 31.10.2018 03:34
Вопросы из категории :
32x32