Я получаю исключение синтаксиса шаблонов для следующей программы. Я избежал обратных косых черт, используя "\\"
, но есть еще исключение:
Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 1
\left(
^
Вот код:
String[] paren = {"\\big(","\\Big(","\\bigg(","\\Bigg(","\\left("};
for(String x : paren){
if(line.contains(x))
line=line.replaceAll(x, "("); //error on this line
}
Благодарю.
\l
- некорректная escape-последовательность, и у вас есть unescaped (
.
Обратите внимание: если вы хотите совместить буквенную обратную косую черту, вам нужно удвоить ее, а затем снова избежать этого, потому что все это находится внутри строкового литерала. Вот почему "\\l"
анализируется как шаблон регулярного выражения \l
(что является недопустимой escape-последовательностью). И "\\b"
и "\\B"
анализируются как escape-последовательности \b
и \B
которые являются word- и несловными границами.
Предполагая, что вы хотите совместить буквальную обратную косую черту, попробуйте это вместо этого:
{"\\\\big\\(","\\\\Big\\(","\\\\bigg\\(","\\\\Bigg\\(","\\\\left\\("};
но тогда ваш вызов contains(...)
больше не будет работать!
Или, может быть, лучше/безопаснее, пусть Pattern
кавычка/уберет ваш вход правильно:
String[] paren = {"\\big(","\\Big(","\\bigg(","\\Bigg(","\\left("};
for(String x : paren){
if(line.contains(x)) {
line = line.replaceAll(Pattern.quote(x), "(");
}
}
Если ваша цель - заменить каждый из литералов "\\big("
, "\\Big("
, "\\bigg("
, "\\Bigg("
, "\\left("
тогда не используйте replaceAll
потому что он использует regex как первый аргумент, представляющий значение, которое должно быть заменено. В ваших случаях строки, которые вы хотите заменить, содержат метасимволы регулярного выражения, такие как (
или такие якоря, как \\b
\\B
поэтому, даже если это не будет выбрасывать исключение, вы не получите желаемых результатов.
Вместо этого используйте метод replace
(without All
suffix), который автоматически удалит все метасимволы регулярных выражений, поэтому вы избежите таких проблем, как unescaped (
.
Поэтому попробуйте
String[] paren = {"\\big(","\\Big(","\\bigg(","\\Bigg(","\\left("};
for(String x : paren){
if(line.contains(x))
line=line.replace(x, "(");
}
(
вparen
значений «ы.String#replaceAll
метод проходит свой первый аргумент через регулярное выражение шаблона компилятор, и(
имеет особое значение для регулярных выражений группировки, но и ожидает закрытия)
, что вашparen
значение не имеет.