Spec-Zone.ru › JavaScript

Буферные граничные утверждения: \A, \z, \Z

Экспериментально: Это экспериментальная технология
Внимательно проверьте таблицу совместимости браузеров перед использованием этого в продакшене.

Экспериментально: Это экспериментальная технология
Внимательно проверьте таблицу совместимости браузеров перед использованием этого в продакшене.

Буферное граничное утверждение проверяет, находится ли текущая позиция в строке строго в начале или конце всей строки (\Z также разрешает конечный перевод строки), независимо от наличия флага m (который изменяет значения ^ и $ входных граничных утверждений). Оно поддерживается только в режиме с поддержкой Unicode.

Синтаксис

\A
\z
\Z

Описание

\A утверждает, что текущая позиция находится в начале всей строки. \z утверждает, что текущая позиция находится в конце всей строки. \Z аналогичен \z, но также соответствует позиции перед терминатором строки или последовательностью \r\n (CRLF) в конце строки. Все они являются утверждениями, поэтому они не потребляют никаких символов.

Точнее, \A утверждает, что символ слева находится за пределами строки; \z утверждает, что символ справа находится за пределами строки; \Z эквивалентен (?=(?:\r?\n?|[\u{2028}\u{2029}]?)\z).

Эти утверждения имеют смысл только тогда, когда слева или справа от них не ожидается никаких символов. Например, f\Ao никогда не совпадает, потому что \A не может одновременно находиться в начале строки и иметь символ слева от себя.

Утверждения \A и \z полезны только при использовании флага m. Без m они ведут себя точно так же, как ^ и $. Если ваш шаблон должен совпадать только с началом или концом всей строки или строки (и никогда со смешанным вариантом), рекомендуемый подход — по-прежнему использовать утверждения ^ и $, и при необходимости установить флаг m, поскольку они более широко поддерживаются, чем буферные граничные утверждения. Если вам нужно сопоставить оба типа границ в одном шаблоне, вы можете использовать модификаторы для включения или отключения флага m в различных частях шаблона, но использование этих escape-последовательностей делает код намного более читабельным.

Примеры

Смешивание буферных и входных граничных утверждений

Предположим, у вас есть шаблон, который должен совпадать либо в начале всей строки, либо в начале одной строки. Вы можете включить m, чтобы использовать ^ для второй, а затем использовать \A для первой (вам также нужно включить u, чтобы использовать \A).

Этот пример сопоставляет строчные комментарии на отдельных строках, которые могут быть hashbang в начале файла или строчными комментариями на любой строке. Он не сопоставляет строчные комментарии в конце строки, содержащей код.

function findLineComments(code) {
  // Matches the hashbang syntax: #!... (which is only valid at start of file)
  // and line comment syntax: //... (which is valid everywhere)
  const pattern = /\A#!.*|^\s*\/\/.*/gmu;
  return code.match(pattern);
}

const program = `#!/usr/env/node

function findLineComments(code) {
  // Matches the hashbang syntax: #!... (which is only valid at start of file)
  // and line comment syntax: //... (which is valid everywhere)
  const pattern = /\\A#!.*|^\\/\\/.*/gmu;
  return code.match(pattern);
}
`;

console.log(findLineComments(program));
// [
//   '#!/usr/env/node',
//   '  // Matches the hashbang syntax: #!... (which is only valid at start of file)',
//   '  // and line comment syntax: //... (which is valid everywhere)'
// ]

Другим основным сценарием использования буферных граничных утверждений является ситуация, когда вы не можете изменить флаги, например, при поиске регулярных выражений в текстовых редакторах. В этих случаях по умолчанию обычно включен m, поэтому вам нужно использовать \A и \z, чтобы "отказаться".

Сопоставление конца файла, но с разрешением необязательного конечного перевода строки

Файловые форматы часто допускают необязательный перевод строки в конце файла. Если вы хотите сопоставить шаблон конца файла, допускающий конечный перевод строки, вы можете использовать \Z. Эта функция полезна с флагом m или без него.

const endOfPDF = /%%EOF\Z/u;

console.log(endOfPDF.test("%%EOF")); // true
console.log(endOfPDF.test("%%EOF\n")); // true
console.log(endOfPDF.test("%%EOF\r\n")); // true
console.log(endOfPDF.test("%%EOF\n\n")); // false
console.log(endOfPDF.test("%%EOF\nsomething")); // false

Спецификации

Спецификация
Буферные границы регулярных выражений для ECMAScript
# sec-patterns

Совместимость с браузерами

Настольные Мобильные Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android WebView на iOS Bun Deno Node.js
buffer_boundary_assertion
Нет
Нет
preview
Нет
preview
Нет
Нет
Нет
Нет
Нет
Нет
Нет
Нет
Нет
Нет

См. также

  • Руководство по утверждениям
  • Регулярные выражения
  • Входное граничное утверждение: ^, $
  • Граница слова: \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/Buffer_boundary_assertion

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API