Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Квантификаторы в Look-ahead условиях


Автор: serious 6.12.2007, 11:49
Условие такого вида работает
Код
(?<!\\d{2}\\s\\d{2}\\s)

, а вот такого
Код
(?<!\\d{2}[b]\\s+[\b]\\d{2}\\s)

не компилируется (Caused by: java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index 18).

Объясните, пожалуйста, как учитывать множественные пробелы в условиях? Почему для символьного класса \d можно указать квантификаторы в условии, а для \s нет?

Автор: serious 6.12.2007, 14:21
Неужели те, кто работал с регулярными выражениями, не встречались с такой проблемой?

Автор: SergeCpp 6.12.2007, 15:40
Укажите "obvious maximum length" для квантификатора при Look-behind

Для \d она указана: 2

Для \s она не указана: + (что == {1,бесконечность})

Попробуйте вместо \s+ написать \s{1,10} (измените 10 в зависимости от специфики задачи)

P.S. Хотя http://www.javaregex.com/RegexRecipesV1.pdf используется +

Код
// a negative lookbehind
p = Pattern.compile("(?<!a+)foo(.)");
m = p.matcher(txt);
if(m.find()) {
System.out.println(m.group(1)); // prints "c"
}


Автор: serious 6.12.2007, 16:24
Цитата(SergeCpp @  6.12.2007,  07:40 Найти цитируемый пост)

Попробуйте вместо \s+ написать \s{1,10} (измените 10 в зависимости от специфики задачи)

Не очень мне нравится такое решение... Неужели не существует способа указать в данном случае произвольное количество пробелов?

Автор: SergeCpp 6.12.2007, 16:35
Может быть, возможно как-то по-другому составить выражение, без такой штуки в Look-behind?

Ведь Look-behind не всегда же было (да и сейчас не везде есть), как-то обходились

Для чего выражение нужно-то?

P.S. Джеффри Фридл. "Регулярные выражения" читали?

Автор: serious 6.12.2007, 16:42
Чтобы проверить, что перед искомым текстом не идет последовательность \d{2}\s\d{2}, т.е. серия паспорта.
Хлтя, я понял что \s+ мне в данном случае не требуется  smile , слишком сложное условие получается.

SergeCpp, а я тут уже жуткие вещи начал изобретать  smile Нда, проще надо быть, проще...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)