Почему есть PatternSyntax Excpetion для следующей программы?

1

Я получаю исключение синтаксиса шаблонов для следующей программы. Я избежал обратных косых черт, используя "\\", но есть еще исключение:

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
}

Благодарю.

  • 0
    Попробуйте избежать вашего ( в paren значений «ы. String#replaceAll метод проходит свой первый аргумент через регулярное выражение шаблона компилятор, и ( имеет особое значение для регулярных выражений группировки, но и ожидает закрытия ) , что ваш paren значение не имеет.
  • 0
    @ajp15243 ajp15243, спасибо! Ваше решение сработало :)
Теги:
exception

2 ответа

2

\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), "(");
    }
}
0

Если ваша цель - заменить каждый из литералов "\\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, "("); 
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню