Regex lookahead, lookbehind и атомные группы

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

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

3 Solutions collect form web for “Regex lookahead, lookbehind и атомные группы”

Примеры

Учитывая строку 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(?=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. соответствуют его второй альтернативной 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}$)[az]{1,2}[0-9]{2,3} 

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

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

  • Отрицательный взгляд

Синтаксис:

 (?!REGEX_1)REGEX_2 

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

пример:

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

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

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

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

Грохоты быстро исчезают.
Как отличить lookahead и lookbehind? Пройдите 2 минуты тура со мной:

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

предполагать

  ABC #in a line 

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

Один, B имеет A вперед и имеет C bebind
Два, B впереди (lookahead) C и сзади (lookhehind) A.

Как мы видим, в обоих решениях противоположные и дальнейшие противоположны.
Regex - это решение Two.

Давайте будем гением компьютера.