Java Regex - экранируйте все специальные символы регулярных выражений
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
является частью самой входной строки.)
1 плюс
Это как избежать всех метасимволов регулярных выражений.
Фон:
Если вам нужно преобразовать некоторый входной или динамический источник в регулярное выражение,
то оно обязательно будет% 100 литералом.\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
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- java Почему я не могу объявить статические методы в интерфейсе?
- regex Learning Regular Expressions
- regex Regex и unicode
- regex Мое регулярное выражение слишком подходит. Как мне это остановить?
- regex Как выполнить подстановку Perl для строки, сохранив оригинал?
- regex Замена n-го экземпляра совпадения с регулярным выражением в Javascript
- regex Как заменить простые URL ссылками?
- special-characters Как я могу заблокировать или ограничить специальные символы из полей ввода с помощью jquery?
- special-characters Допустимые символы в параметре GET
- special-characters Java: что значит ~
- special-characters Как я могу написать символ & в Android Strings.xml
- special-characters writing some characters like '<' in an xml file
- special-characters Браузер отображает вместо ´