Различная оценка регулярных выражений в коллекциях или шаблонах - PullRequest
1 голос
/ 03 февраля 2012

Я испытываю странное поведение при поиске регулярного выражения в vim:

Я пытаюсь очистить лишний пробел в файле и хочу использовать для него команду замены.

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

\%[\s]\{2,}

Когда я использую одно и то же регулярное выражение с шаблонами вместо коллекций, vim правильно сопоставляет только 2 или более пробелов:

\%(\s\)\{2,}

Я знаю, что мне не нужно использовать коллекцию, но если я попробую выражение в онлайн-анализаторе регулярных выражений (например, Rubular ), оно также будет работать с коллекцией.

Может кто-нибудь объяснить, почему эти выражения не оцениваются одинаково?

Ответы [ 2 ]

6 голосов
/ 03 февраля 2012

Поскольку \%[...] и \%(...\) - это совершенно разные шаблоны.

  • \%[...] означает последовательность необязательных атомов.Например, r\%[ead] соответствует «read», «rea», «re» и «r».
  • В то время как \%(...\) обрабатывает вложенные атомы как один атом.Например, r\%(ead\) соответствует только «read».

Так что

  • \%[\s]\{2,} можно интерпретировать как \(\s\|\)\{2,}, затем \(\s\|\)\(\s\|\)\|\(\s\|\)\(\s\|\)\(\s\|\)\|....Здесь \(\s\|\)\(\s\|\), минимальный шаблон, можно интерпретировать как \(\)\(\), \(\)\(\s\), \(\s\)\(\) или \(\s\)\(\s\).Он также соответствует 1 пробелу.
  • \%(\s\)\{2,} можно интерпретировать как \s\{2,}, затем \s\s\|\s\s\s\|....Он соответствует только 2 или более пробельным символам.
3 голосов
/ 03 февраля 2012

отвечает ли это на ваш вопрос?

http://vimdoc.sourceforge.net/htmldoc/pattern.html#/\%[]

    A sequence of optionally matched atoms.  This always matches.

    It matches as much of the list of atoms it contains as possible.  
    Thus it stops at the first atom that doesnt match.  
    For example:

    /r\%[ead]

    matches "r", "re", "rea" or "read".  The longest that matches is used.

Проблема в том, что всегда соответствует и переопределяет квантификатор {2,} на обороте.

редко используется, но тем не менее интересен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...