Ошибка регулярного выражения Java - группа наблюдения не имеет очевидной максимальной длины - PullRequest
15 голосов
/ 25 сентября 2011

Я получаю эту ошибку:

java.util.regex.PatternSyntaxException: Look-behind group does not have an
    obvious maximum length near index 22
([a-z])(?!.*\1)(?<!\1.+)([a-z])(?!.*\2)(?<!\2.+)(.)(\3)(.)(\5)
                      ^

Я пытаюсь сопоставить COFFEE, но не BOBBEE.

Я использую Java 1.6.

Ответы [ 3 ]

16 голосов
/ 13 декабря 2011

Чтобы избежать этой ошибки, вы должны заменить + на регион, подобный {0,10}:

([a-z])(?!.*\1)(?<!\1.{0,10})([a-z])(?!.*\2)(?<!\2.{0,10})(.)(\3)(.)(\5)
8 голосов
/ 25 сентября 2011

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

([a-z])(?!.*\1)([a-z])(?!.*\2)(.)(\3)(.)(\5)

Оба взгляда делаютне добавляйте ничего: первый утверждает, по крайней мере, два символа, где у вас был только один, а второй проверяет, что второй символ отличается от первого, который уже был покрыт (?!.*\1).

Рабочий пример: http://regexr.com? 2up96

4 голосов
/ 30 мая 2014

Java делает шаг вперед, допуская конечное повторение. Вы по-прежнему не можете использовать звезду или плюс, но вы можете использовать знак вопроса и фигурные скобки с указанным параметром max. Java определяет минимальную и максимально возможную длину вида сзади.
Взгляд в регулярном выражении (?<!ab{2,4}c{3,5}d)test имеет 6 возможных длин. Длина может быть от 7 до 11 символов. Когда Java (версия 6 или более поздняя) пытается сопоставить внешний вид, она сначала отступает назад на минимальное количество символов (7 в этом примере) в строке, а затем оценивает регулярное выражение внутри внешнего вида как обычно слева направо. Если это не удается, Java отступает еще на один символ и пытается снова. Если lookbehind продолжает давать сбой, Java продолжает отступать до тех пор, пока lookbehind либо не совпадет, либо вернется к максимальному количеству символов (11 в этом примере). Этот повторяющийся шаг назад через строку темы убивает производительность, когда увеличивается число возможных длин вида сзади. Имейте это в виду. Не выбирайте сколь угодно большое максимальное количество повторений, чтобы обойти отсутствие бесконечных квантификаторов внутри вид сзади. В Java 4 и 5 есть ошибки, которые приводят к сбою просмотра с чередованием или переменными квантификаторами, когда в некоторых ситуациях это должно быть успешным. Эти ошибки были исправлены в Java 6.

Скопировано из Здесь

...