Я нашел эти вещи в своем теле регулярных выражений, но у меня нет понятия, для чего я могу их использовать. У кого-нибудь есть примеры, чтобы я мог попытаться понять, как они работают?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
regex
lookaround
Spidfire
источник
источник
Ответы:
Примеры
Учитывая строку
foobarbarfoo
:Вы также можете объединить их:
Определения
Смотри вперед позитивно
(?=)
Найдите выражение A, где следует выражение B:
Смотри вперед негатив
(?!)
Найдите выражение A, где выражение B не следует:
Смотреть за позитивом
(?<=)
Найдите выражение A, где предшествует выражение B:
Смотреть за минусом
(?<!)
Найдите выражение A, где выражение B не предшествует:
Атомные группы
(?>)
Атомная группа выходит из группы и выбрасывает альтернативные шаблоны после первого сопоставленного шаблона внутри группы (обратное отслеживание отключено).
(?>foo|foot)s
применяется кfoots
будет соответствовать его 1-й альтернативеfoo
, затем потерпит неудачу, посколькуs
не следует сразу, и остановится, поскольку обратный ход отключенНеатомарная группа позволит вернуться; если последующее сопоставление вперед не удастся, оно будет возвращаться и использовать альтернативные шаблоны, пока не будет найдено совпадение для всего выражения или пока не исчерпаны все возможности.
(foo|foot)s
применяется кfoots
воле:foo
, затем потерпите неудачу, посколькуs
не сразу следуетfoots
, и вернитесь к ее 2-й альтернативе;foot
, затем преуспейте, какs
сразу следуетfoots
, и остановитесь.Некоторые ресурсы
Интернет-тестеры
источник
Lookarounds - это утверждения нулевой ширины. Они проверяют регулярное выражение (вправо или влево от текущей позиции - на основе впереди или сзади), успешно или не удается, когда найдено совпадение (на основании положительного или отрицательного значения), и отбрасывают совпадающую часть. Они не потребляют никаких символов - совпадение с регулярным выражением, следующее за ними (если оно есть), начнется с той же позиции курсора.
Читайте регулярно-expression.info для более подробной информации.
Синтаксис:
Совпадение только в случае совпадения REGEX_1; после сопоставления REGEX_1 совпадение отбрасывается, и поиск REGEX_2 начинается с той же позиции.
пример:
REGEX_1
[a-z0-9]{4}$
соответствует четырем буквенно-цифровым символам, за которыми следует конец строки.REGEX_2
[a-z]{1,2}[0-9]{2,3}
соответствует одной или двум буквам, за которыми следуют две или три цифры.REGEX_1 гарантирует, что длина строки действительно равна 4, но не использует никаких символов, поэтому поиск REGEX_2 начинается с того же места. Теперь REGEX_2 удостоверяется, что строка соответствует некоторым другим правилам. Без заблаговременности он будет соответствовать строкам длиной три или пять.
Синтаксис:
Совпадение только в том случае, если REGEX_1 не совпадает; После проверки REGEX_1 поиск REGEX_2 начинается с той же позиции.
пример:
Предварительная часть проверяет наличие
FWORD
в строке и завершается ошибкой, если находит ее. Если он не находитFWORD
, предварительный просмотр завершается успешно, и следующая часть проверяет, что длина строки составляет от 10 до 30 и содержит только словаa-zA-Z0-9_
Взгляд назад похож на прогноз вперед: он просто смотрит позади текущей позиции курсора. Некоторые разновидности регулярных выражений, такие как javascript, не поддерживают косвенные утверждения. И большинство разновидностей, которые его поддерживают (PHP, Python и т. Д.), Требуют, чтобы эта часть просмотра имела фиксированную длину.
источник
(?=REGEX_1)REGEX_2
только еслиREGEX_2
придет послеREGEX_1
?Гроккинг смотрит вокруг быстро.
Как различить взгляд вперед и взгляд назад? Возьмите 2-минутный тур со мной:
предполагать
Теперь мы спрашиваем B, где ты?
У B есть два решения, чтобы объявить это местоположение:
Во-первых, у B впереди есть A, а у C есть
два, у B впереди ( взгляд вперед) на C и позади (взгляд сзади) A.
Как мы видим, задние и передние противоположны в двух решениях.
Regex - это решение Два.
источник