Когда использовать положительные поисковые запросы в Regex?

Может ли кто-нибудь объяснить мне, почему и когда я должен использовать положительные поисковые запросы в Regex? Для негативных поисков я могу думать о сценариях, где они являются единственным решением, но для позитивных поисков я не понимаю, зачем их использовать, когда их результат также может быть получен с помощью групп захвата.

Например:

Ввод: Bus: red, Car: blue

Хочу цвет машины.

С обзором: (?<=Car: )\w+ С группой захвата: Car: (\w+)

Оба Regex архивируют один и тот же результат - прямой доступ к цветовому соответствию. Так есть ли случаи, которые можно решить только положительным взглядом?


person netblognet    schedule 09.08.2016    source источник


Ответы (2)


PCRE используется не только в PHP, библиотека используется во множестве инструментов и языков, где не всегда есть легкий доступ к захваченным группам.

В некоторых из них просмотр назад - это самый простой способ, скажем, разделить строку (с strsplit в R) или обойти проблемы с доступом к подспадам.

PCRE lookbehind в некотором роде "урезан", то есть имеет фиксированную ширину, и поэтому на самом деле не так уж и полноценен. Однако есть интересный случай: используется положительный ретроспективный просмотр после совпадение увеличивает производительность: \d{3}(?<=USD\d{3}). Здесь проверка начинается только после того, как мы сопоставили 3 цифры, нет необходимости проверять U, затем S, затем D, затем цифры.

Что касается положительного просмотра вперед, он используется во многих сценариях:

  • Задайте условия для совпадающей строки (см. Ответ Дмитрия, также например, для ^(?=.*\d) потребуется как минимум 1 цифра в строке)
  • Перекрывающиеся совпадения возможны (например, -\d+(?=-|$) найдет 3 совпадения в -1-2-3)
person Wiktor Stribiżew    schedule 09.08.2016

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

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

^(?=.{0,20}$).*(?:Bus: red|Car: blue)

Демо: https://regex101.com/r/iQ4uL4/1

Дополнительные примеры такого рода можно найти здесь: https://stackoverflow.com/a/21456918/4295017

person Dmitry Egorov    schedule 09.08.2016
comment
Еще один вопрос. Почему вы пишете опережающий просмотр перед основным шаблоном регулярного выражения? Я думал, что мне нужно написать lookaheads, а также lookbehind после / справа от шаблона регулярного выражения, на который он ссылается ?! - person netblognet; 09.08.2016
comment
@netblognet, на самом деле, это после шаблона ^, поэтому этот ^ шаблон, к которому привязан просмотр вперед. - person Dmitry Egorov; 10.08.2016