Регулярное вперед, назад и атомных групп


Я нашел эти вещи в моем теле regex, но я не знаю, для чего я могу их использовать. У кого-нибудь есть примеры, чтобы я мог попытаться понять, как они работают?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind

(?>) - atomic group
3 316

3 ответа:

примеры

Дана строка foobarbarfoo:

bar(?=bar)     finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar)     finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar    finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar    finds the 2nd bar ("bar" which does not have "foo" before it)

вы также можете комбинировать их:

(?<=foo)bar(?=bar)    finds the 1st bar ("bar" with "foo" before it and "bar" after it)

определения

смотреть вперед позитивно (?=)

найти выражение A, где выражение B следует:

A(?=B)

смотрите вперед отрицательно (?!)

найти выражение A, где выражение B не следует:

A(?!B)

посмотри за позитив (?<=)

найти выражение A, где выражение B предшествует:

(?<=B)A

посмотрите за негатив (?<!)

найти выражение A, где выражение B не предшествует:

(?<!B)A

атомные группы (?>)

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

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

  • неатомная группа в выражении (foo|foot)s применил к foots будет:

    1. соответствует его 1-й альтернативе foo, то не получится как s не сразу следует в foots, и вернуться к его 2-й альтернатива;
    2. матч его 2-й альтернативы foot, тогда получится как s сразу же следует в foots, и прекратить.
  • атомарная группа в выражении (?>foo|foot)s применил к foots будет соответствовать его 1-й альтернативе foo, то не получится как s не сразу следует, и остановить, как отступление отключено.

некоторые ресурсы

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

читать regular-expression.info Подробнее подробности.

  • позитивный просмотр вперед:

синтаксис:

(?=REGEX_1)REGEX_2

совпадение только при совпадении REGEX_1; после совпадения REGEX_1 совпадение отбрасывается и поиск REGEX_2 начинается в той же позиции.

пример:

(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}

REGEX_1 составляет [a-z0-9]{4}$ который соответствует четырем буквенно-цифровым символам, за которыми следует конец строки.
REGEX_2 составляет [a-z]{1,2}[0-9]{2,3} что соответствует одной или двух букв, за которыми следуют две или три десятичные знаки.

REGEX_1 гарантирует, что длина строки действительно 4, но не потребляет никаких символов, так что поиск REGEX_2 начинается в том же месте. Теперь REGEX_2 гарантирует, что строка соответствует некоторым другим правилам. Без оглядки вперед он будет соответствовать струнам длиной три или пять.

  • отрицательный lookahead

синтаксис:

(?!REGEX_1)REGEX_2

совпадение только если REGEX_1 не совпадает; после проверки REGEX_1, поиск REGEX_2 начинается с той же позиции.

пример:

(?!.*\bFWORD\b)\w{10,30}$

часть look-ahead проверяет наличие FWORD в строке и если он не находит его. Если он не найдет FWORD, look-ahead преуспевает, и следующая часть проверяет, что длина строки находится между 10 и 30 и что она содержит только символы слова a-zA-Z0-9_

Look-behind похож на look-ahead: он просто смотрит за текущую позицию курсора. Некоторые регулярные выражения, такие как javascript не поддерживает скрытые утверждения. И большинство ароматов, которые его поддерживают (PHP, Python и т. д.), требуют, чтобы часть look-behind имела фиксированную длину.

  • атомарные группы в основном отбрасывают / забывают последующие маркеры в группе, как только маркер совпадает. Проверьте эту страницу для примеров атомные группы

Grokking lookaround быстро.
Как отличить lookahead и lookbehind? Возьмите 2 минуты тур со мной:

(?=) - positive lookahead
(?<=) - positive lookbehind

предположим

    A  B  C #in a line

теперь мы спрашиваем Б, где ты?
B имеет два решения для объявления его местоположения:

один, B имеет a впереди и имеет C bebind
Во-вторых, B впереди (lookahead) C и позади (lookhehind) A.

Как мы видим, позади и впереди противоположны в двух решениях.
Регулярное выражение является решение второе.