Lookbehind assertion: (?<=...), (? Baseline Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Baseline Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Lookbehind assertion (утверждение поиска назад) "смотрит назад": оно пытается сопоставить предыдущий ввод с заданным шаблоном, но не потребляет никакого ввода — если сопоставление успешно, текущая позиция во вводе остается прежней. Оно сопоставляет каждый атом в своем шаблоне в обратном порядке.
Синтаксис
(?<=pattern) (?<!pattern)
Параметры
-
pattern - Шаблон, состоящий из чего угодно, что вы можете использовать в регулярном выражении, включая дизъюнкцию.
Описание
Регулярное выражение обычно сопоставляет текст слева направо. Именно поэтому lookahead (утверждение поиска вперед) и lookbehind (утверждение поиска назад) называются так — lookahead утверждает, что находится справа, а lookbehind — что находится слева.
Для того чтобы (?<=pattern) assertion (утверждение) увенчалось успехом, pattern должно соответствовать вводу непосредственно слева от текущей позиции, но текущая позиция не изменяется перед сопоставлением последующего ввода. Форма (?<!pattern) инвертирует утверждение — оно успешно, если pattern не соответствует вводу непосредственно слева от текущей позиции.
Lookbehind, как правило, имеет ту же семантику, что и lookahead — однако внутри lookbehind регулярное выражение сопоставляется *назад*. Например,
/(?<=([ab]+)([bc]+))$/.exec("abc"); // ['', 'a', 'bc']
// Not ['', 'ab', 'c']
Если lookbehind будет сопоставляться слева направо, он сначала жадно сопоставит [ab]+, что приведет к тому, что первая группа захватит "ab", а оставшаяся "c" будет захвачена [bc]+. Однако, поскольку [bc]+ сопоставляется первым, он жадно захватывает "bc", оставляя только "a" для [ab]+.
Это поведение разумно —матчер не знает, где *начать* сопоставление (поскольку lookbehind может иметь переменную длину), но он знает, где *закончить* (в текущей позиции). Следовательно, он начинает с текущей позиции и работает в обратном направлении. (Регулярные выражения в некоторых других языках запрещают lookbehind с переменной длиной, чтобы избежать этой проблемы.)
Для квантифицированных захватывающих групп внутри lookbehind, вместо ближайшего к правой границе сопоставления во входной строке захватывается сопоставление, находящееся дальше всего слева, из-за обратного сопоставления. Дополнительную информацию см. на странице о захватывающих группах. Обратные ссылки внутри lookbehind должны располагаться *слева* от группы, на которую они ссылаются, также из-за обратного сопоставления. Однако дизъюнкции по-прежнему пытаются сопоставить слева направо.
Примеры
Сопоставление строк без их потребления
Подобно lookahead, lookbehind можно использовать для сопоставления строк без их потребления, чтобы извлекать только полезную информацию. Например, следующий регулярное выражение сопоставляет число в метке цены:
function getPrice(label) {
return /(?<=\$)\d+(?:\.\d*)?/.exec(label)?.[0];
}
getPrice("$10.53"); // "10.53"
getPrice("10.53"); // undefined
Аналогичного эффекта можно добиться, захватив интересующее вас подсопоставление.
Спецификации
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
lookbehind_assertion |
62 |
79 |
78 |
49 |
16.4 |
62 |
79 |
46 |
16.4 |
8.0 |
62 |
16.4 |
1.0.0 |
1.0 |
8.10.0 |
См. также
- Руководство по утверждениям (Assertions)
- Регулярные выражения
- Утверждение границы ввода:
^,$ - Утверждение границы слова:
\b,\B - Утверждение поиска вперед:
(?=...),(?!...) - Захватывающая группа:
(...)
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookbehind_assertion