Регулярные выражения в стиле Perl (на которых более или менее основан механизм регулярных выражений Java) обрабатывают следующие символы как специальные символы:
.^$|*+?()[{\
имеют специальное значение вне классов символов,
]^-\
имеют специальное значение внутри классов символов ([...]
).
Таким образом, вам нужно избегать этих (и только тех) символов в зависимости от контекста (или, в случае классов символов, размещать их в положениях, где их нельзя неправильно интерпретировать).
Может оказаться ненужным экранирование других символов, но некоторые движки регулярных выражений будут воспринимать это как синтаксические ошибки, например, \_
приведет к ошибке в .NET.
Некоторые другие приведут к ложным результатам, например, \<
интерпретируется как литерал <
в Perl, но в egrep
это означает «границу слова».
Поэтому напишите -?\d+\.\d+\$
, чтобы соответствовать 1.50$
, -2.00$
и т. Д. И [(){}[\]]
для класса символов, который соответствует всем видам скобок / скобок / скобок.
Если вам нужно преобразовать строку ввода пользователя в форму, безопасную для регулярных выражений, используйте java.util.regex.Pattern.quote
.
Дальнейшее чтение: Блог Яна Гойварта RegexGuru по экранированию метасимволов