Есть ли в Java встроенный способ экранирования произвольного текста, чтобы его можно было включить в регулярное выражение? Например, если мои пользователи вводят «5 долларов», я бы хотел, чтобы это совпадало, а не «5» после окончания ввода.
320
\Q
и\E
. Это может привести к неожиданным результатам, напримерPattern.quote("*.wav").replaceAll("*",".*")
, приведет к,\Q.*.wav\E
а не так.*\.wav
, как вы могли ожидать."mouse".toUpperCase().replaceAll("OUS","ic")
он вернетсяMicE
. Вы не ожидаете, что он вернется,MICE
потому что вы не подали заявкуtoUpperCase()
наic
. В моем примереquote()
это также относится и к.*
вкладышуreplaceAll()
. Вы должны сделать что-то еще, возможно.replaceAll("*","\\E.*\\Q")
, сработает, но это противоречит здравому смыслу.*.wav
в шаблон регулярного выражения\*\.wav
, а replaceAll превратил бы его в\.*\.wav
, то есть файлы соответствия, имя которых состоит из произвольного числа периодов, за которыми следует.wav
. Скорее всего, вам бы понадобилось,replaceAll("\\*", ".*")
если бы они пошли с более хрупкой реализацией, которая основывается на распознавании всех возможных активных символов регулярных выражений и экранировании их по отдельности ... это было бы намного проще?Разница между
Pattern.quote
иMatcher.quoteReplacement
не была понятна мне до того, как я увидел следующий примеристочник
Pattern.quote
заменяет специальные символы в строках поиска регулярных выражений, например. | + () И т. Д., ИMatcher.quoteReplacement
заменяет специальные символы в строках замены, например \ 1 для обратных ссылок.quoteReplacement
только заботами о двух символов$
и\
которые могут быть использованы , например , в замене строк в качестве обратных ссылок$1
или\1
. Поэтому его нельзя использовать для экранирования / цитирования регулярного выражения.$Group$
сT$UYO$HI
.$
Символ является особенным , как в шаблоне и в замене:"$Group$ Members".replaceFirst(Pattern.quote("$Group$"), Matcher.quoteReplacement("T$UYO$HI"))
Возможно, будет слишком поздно для ответа, но вы также можете использовать
Pattern.LITERAL
, который будет игнорировать все специальные символы при форматировании:источник
Pattern.CASE_INSENSITIVE
Я думаю, что вы после этого
\Q$5\E
. Также см.Pattern.quote(s)
Введено в Java5.См. Шаблон Javadoc для деталей.
источник
Во-первых, если
это не будет ставить 1 в конце. Он будет смотреть на регулярное выражение поиска для первой подходящей группы и подпункта THAT. Это означает, что $ 1, $ 2 или $ 3 означают в тексте замены: соответствующие группы из шаблона поиска.
Я часто вставляю длинные строки текста в файлы .properties, а затем генерирую из них темы и сообщения электронной почты. Действительно, это, кажется, способ сделать i18n по умолчанию в Spring Framework по умолчанию. Я помещаю теги XML в качестве заполнителей в строки и использую replaceAll () для замены тегов XML значениями во время выполнения.
Я столкнулся с проблемой, когда пользователь вводил цифру в долларах и центах со знаком доллара. replaceAll () захлебнулся, и в следовой строке появилось следующее:
В этом случае пользователь ввел «$ 3» где-то в своем вводе, а replaceAll () пошёл искать в регулярном выражении поиска третью подходящую группу, не нашел ее и рванул.
Дано:
замена
с участием
решил проблему. Пользователь может вводить любые символы, включая знаки доллара, без проблем. Он вел себя именно так, как вы ожидаете.
источник
Чтобы иметь защищенный шаблон, вы можете заменить все символы на «\\\\», кроме цифр и букв. И после этого вы можете вставить в этот защищенный шаблон ваши специальные символы, чтобы этот шаблон работал не как глупый цитируемый текст, а как паттерн, но как ваш собственный. Без специальных символов пользователя.
источник
Pattern.quote ("Blabla") работает хорошо.
Pattern.quote () работает хорошо. Он включает в себя предложение с символами « \ Q » и « \ E », и, если он экранирует «\ Q» и «\ E». Однако, если вам нужно сделать реальное экранирование регулярного выражения (или пользовательское экранирование), вы можете использовать этот код:
Этот метод возвращает: Some / \ s / wText * / \, **
Код для примера и тесты:
источник
Символ ^ (Отрицание) используется для сопоставления чего-либо, чего нет в группе символов.
Это ссылка на регулярные выражения
Вот информация об изображении об отрицании:
источник