Регулярное вперед, назад и атомных групп
Я нашел эти вещи в моем теле regex, но я не знаю, для чего я могу их использовать. У кого-нибудь есть примеры, чтобы я мог попытаться понять, как они работают?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
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-й альтернативе
foo
, то не получится какs
не сразу следует вfoots
, и вернуться к его 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.Как мы видим, позади и впереди противоположны в двух решениях.
Регулярное выражение является решение второе.