2015-05-26 3 views
0

У меня есть файл журнала текст так:Использование именованных групп в регулярных выражениях вызывает «не касательно предшествующего текста имеют очевидную максимальную длину» ошибка

21.125.155.111 - - [01/Jan/2012:12:07:48 +0530] "GET /digital-cameras/digital-camera/sony-qx-dsc-qx100-point-shoot-digital-camera-black.html HTTP/1.1" 200 1470 "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17" "-"

и моя картина:

"(?<ip>[\\d\\.]+)(.+)\\\"(?<verb>\\w+) (?<address>.+) (?<protocol>[HTTPS]+)/(?<version>.+?)\\\"\\s(?<status>\\d+)\\s(?<time>\\d+)\\s\\\"(?<useragent>.*)\\\"\\s(.*)" 

Но я получаю вышеупомянутое Исключение PatternSyntax при попытке скомпилировать шаблон.

Он отлично работает в C#, но дает исключение в Java 1.6.

+0

Показать свой код. – tnw

+1

Взгляните на различия между шаблоном регулярного выражения, используемым в java и C#: http://stackoverflow.com/questions/538579/are-java-and-c-sharp-regular-expressions-compatible – PCM

+0

публичный класс testerclass { \t частных статических окончательного Строка погладить = "(? [\\ д \\.] +) (+.) \\\" (? \\ W +) (?

+.) (? [HTTPS] +)/(? . +?) \\\ "\\ s (? \\ d +) \\ s (?

ответ

3

У вас есть ошибка Java, которая вызывает ошибочное сообщение об ошибке. Java 6 не поддерживает именованные группы, поэтому, когда компилятор regex видит (?<, он переходит к выводу, что вы пытаетесь создать lookbehind. Он должен подождать, пока он не прочитает еще один символ, прежде чем что-либо делать, и если следующий символ - это ничего, кроме = или !, он должен выдать исключение с более общим объяснением, например «неизвестная группа».

Но решение вашей проблемы - либо перейти на Java 7, либо использовать старомодные нумерованные группы вместо имени.

+0

Хороший ответ! +1 – sln

+0

Большое спасибо Алан Я удалил названные группы и теперь их работу. –