Неограниченные квантификаторы в сложном виде - PullRequest
0 голосов
/ 25 января 2012

У меня много проблем с написанием этого регулярного выражения:

(?<=\s+|^\s*|\(\s*|\.)(?:item|item1|item2)(?=\s+|\s*$|\s*\)|\.)

Это очень хорошо работает в моем редакторе регулярных выражений (Expresso) и в среде .NET, но в среде Java (JRE1.6.0.25 с использованием Eclipse Helios R2) он не работает, поскольку метод Pattern.compile() выдает исключение «Синтаксическая ошибка U_REGEX_LOOK_BEHIND_LIMIT».

Это потому, что шаблон поиска (?<=\s+|^\s*|\(\s*|\.) должен иметь определенный предел (неограниченные квантификаторы, такие как * и +, насколько я знаю, здесь не разрешены).

Iтакже попытался указать диапазон повторений таким образом, но безуспешно:

(?<=\s{0,1000}|^\s{0,1000}|\(\s{0,1000}|\.)(?:item|item1|item2)(?=\s+|\s*$|\s*\)|\.)

Итак, как я могу написать идентичное регулярное выражение, которое работает даже в среде Java?Я не могу поверить, что нет никакого обходного пути для такой общей ситуации ....

1 Ответ

2 голосов
/ 25 января 2012

Имейте в виду, что взгляд сзади будет выглядеть только настолько далеко, насколько это необходимо. Например, (?<=\s+) будет выполнено, если предыдущий символ является пробелом; это не должно смотреть дальше.

То же самое относится и к вашей внешности. Если это не начало строки, а предыдущий символ не является пробелом, открывающей скобкой или точкой, нет смысла смотреть дальше. Это эквивалентно этому:

(?<=^|[\s(.])

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

(?=[\s).]|$)

Итак, последнее регулярное выражение:

(?<=^|[\s(.])(?:item|item1|item2)(?=[\s).]|$)
...