2015-05-27 4 views
0

У меня очень длинное регулярное выражение, которое, похоже, имеет проблемы, но только при импорте из текстового файла. Я сузил к следующему разделу (показано здесь как буквенная строка):Не удается избежать закрывающей круглой скобки в Java?

"(?i)(?<!\\w)\\w{2,3}(?=\\))" 

Как вы можете видеть, ближе к концу, я пытаюсь избежать закрывающую скобки для опережающего просмотра. Теперь, если это жестко закодировано, например:

Pattern myPattern = Pattern.compile("(?i)(?<!\\w)\\w{2,3}(?=\\))"); 

Он работает полностью, как ожидалось. Если, однако, я прочитал его из текстового файла, например:

File patternFile = new File("patterns.txt"); 
List<String> patternText = FileUtils.readLines(patternFile); 
String ucText = patternText.get(0).trim(); 
Pattern myPattern = Pattern.compile(ucText); 

Тогда я получаю сообщение об ошибке:

Exception in thread "Thread-4" java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 25 
(?i)(?<!\\w)\\w{2,3}(?=\\)) 
         ^

Итак, почему же это происходит? Почему избегает закрывающей круглой скобки, когда она закодирована, но не при чтении из текстового файла?

+0

'только при импорте из текста file' Вы должны напечатать, что на консоли. Если он печатает '(? I) (? sln

+0

Используйте только \\ для регулярного выражения, определенного в строке, в противном случае используйте single \ – MaxZoom

ответ

4

Вы пишете строковый литерал Java. \) - это не законный код выхода для строковых литералов Java.

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

+0

Извините, у меня был неправильный код, скопированный и вставленный. Я исправил это. Я предполагаю, что вы ссылались на «жестко закодированный» пример, который на самом деле отлично работает. – Sturm

+2

@Sturm: Теперь у вас слишком много черт. Ваша строка имеет escape-обратную косую черту, а не escape-символ ')'. Ваш текстовый файл является _not_ строковым литералом Java. – SLaks

+0

Итак, в качестве строкового литерала требуется двойное экранирование, но если String хранится в переменной, то это не должно быть двойным экранированием? – Sturm

0

only when imported from a text file

Вы должны напечатать, что на консоли.
Если он печатает (?i)(?<!\w)\w{2,3}(?=\)) его нормально,
, если он печатает с ней дважды бежал, вы должны ООН-бежать тех

Хороший способ не-бегству побег персонаж сделать глобальный поиска/замены
(это% 90 из разбора)

Найти "(?x)\\\\ \\\\"
Заменить "\\\\"

Un-бежать, не ускользают относительный подход.
И это зависит от характера и замены,
или никаких действий на любом из них. Это в основном зависит от языка,
, но вы можете катить свои собственные. Для этого, основные являются ...

Найти "(?xs)\\\\ (.)"
Заменить roll your own"