2013-12-19 4 views
1

Im ищет регулярное выражение - «. (противоречил копия». Я написал следующий код для этогопобега (в регулярном выражении

String str = "12B - (conflicted copy 2013-11-16-11-07-12)"; 
boolean matches = str.matches(".*(conflicted.*"); 
System.out.println(matches); 

Но я получаю исключение

Исключение в потоке "основного" java.util.regex.PatternSyntaxException:.. Незакрытая группа вблизи индекса 15 (противоречили

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

Может кто-нибудь сказать мне, как избежать ( здесь?

ответ

6

Escaping сделано \. В Java \ написан как \\ , поэтому вам следует избегать ( будет \\(.

Сторона примечания: Приятно взглянуть на Pattern#quote, что возвращает литеральный шаблон String. В вашем случае это не так полезно, поскольку вы не хотите скрывать все special-characters.


Поскольку a character preceded by a backslash (\) is an escape sequence and has special meaning to the compiler.

+0

Спасибо. Это работает ! Но можете ли вы сказать мне, почему это \\, когда это \ для ускорения других символов, таких как " –

+0

@PoornimaPrakash См. Мое редактирование. – Maroun

1

В регулярных выражениях все символы могут быть безопасно экранированы, добавив обратную косую черту спереди.

Имейте в виду, что на большинстве языков, включая C#, PHP и Java, сама обратная косая черта также является естественным escape-кодом и, следовательно, должна быть экранирована сама по себе в нелиберальных строках, поэтому вам необходимо ввести "myText \\(".

Использование обратной косой черты внутри регулярных выражений может потребовать от вас, чтобы избежать его как на уровне языка и на уровне регулярных выражений ("\\\\"): это проходит "\\" в регулярных выражений, который разбирает его как самого "\".

2

( в регулярном выражении является метасимволом, что означает «начало группы», и его необходимо закрыть с помощью ). Если вы хотите, чтобы механизм рефиксации протащил его как простой литерал, вам нужно его избежать. Вы можете сделать это, добавив \ перед этим, но так как \ также является метасимволом в String (используется, например, для создания персонажей, таких как "\n", "\t"), вам также нужно сбежать от него, которое будет выглядеть как "\\".Так что попробуйте

str.matches(".*\\(conflicted.*"); 

Другой вариант заключается в использовании класса символов, чтобы избежать ( как

str.matches(".*[(]conflicted.*"); 

Вы также можете использовать Pattern.quote() на часть, которая должна быть экранированы, как

str.matches(".*"+Pattern.quote("(")+"conflicted.*"); 

или просто окружают часть, в которой все символы должны быть пронумерованы как литералы с "\\Q" и "\\E", которые представляют начало и конец цитаты.

str.matches(".*\\Q(\\Econflicted.*"); 
Смежные вопросы