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.

Interesting Posts

Разрешения: папка с информацией об объеме системы, Windows 7

Как отключить потоковую передачу сообщений в Lotus Notes

Лучший способ сохранить чернила в струйном принтере, когда их редко используют?

Аргумент командной строки для запуска в качестве другого пользователя в Windows?

Перенаправление команд командной оболочки в другую консольную оболочку

Восстановление OEM-лицензии с серийного номера ноутбука HP

Как запретить кражу ярлыков на веб-сайтах в Firefox

Не удалось подключиться к FTP-сайтам даже при отключенном брандмауэре Windows

Core i3 и Core i5. В чем разница? Что мне выбрать?

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

Как избавиться от иконки «Zombie» меню «Пуск»?

Как найти, какое фактическое приложение использует порт 80 через системный процесс

Нужно ли мне запускать дефрагментацию на SSD?

Стэнфордский Wrangler идеален, но налагает ограничения, какие другие варианты?

Windows задерживает логин после неудачных попыток пары

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