Предвидение Regex, lookbehind и атомарные группы

314
задан grenierm5 5 October 2015 в 07:14
поделиться

2 ответа

Примеры

Дана строка 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 не следует сразу , и останавливаться, поскольку отслеживание с возвратом отключено

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

  • (foo | foot) s , примененный к foots , будет:

    1. совпадет с его 1-й альтернативой foo , затем не удастся, поскольку s не будет немедленно следовать шагов и вернуться к его 2-му варианту;
    2. сопоставить его 2-й вариант фут , затем добиться успеха, поскольку s сразу следует за ногами , и остановитесь.

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

738
ответ дан 23 November 2019 в 01:06
поделиться

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

Дополнительные сведения см. В 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 проверяет соответствие строки некоторым другим правилам. Без упреждения он будет соответствовать строкам длиной три или пять.

  • Отрицательный просмотр вперед

Синтаксис:

(?!REGEX_1)REGEX_2

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

пример:

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

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

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

  • Атомные группы в основном отбрасывают / забывают последующие токены в группе, как только токен совпадает. На этой странице приведены примеры атомных групп
207
ответ дан 23 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: