Дана строка 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
, будет:
foo
, затем не удастся, поскольку s
не будет немедленно следовать шагов
и вернуться к его 2-му варианту; фут
, затем добиться успеха, поскольку s
сразу следует за ногами
, и остановитесь. Поисковые запросы - это утверждения нулевой ширины. Они проверяют наличие регулярного выражения (справа или слева от текущей позиции - вперед или назад), успешно или неуспешно при обнаружении совпадения (в зависимости от того, положительное оно или отрицательное) и отбрасывают совпавшую часть. Они не потребляют никаких символов - соответствие для следующего за ними регулярного выражения (если есть) начнется с той же позиции курсора.
Дополнительные сведения см. В 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 и т. Д.), Требуют, чтобы эта ретрансляционная часть имела фиксированную длину.