Квантификатор: *, +, ?, {n}, {n,}, {n,m}
Базовый уровень Широко доступен
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Квантификатор повторяет атом определенное количество раз. Квантификатор ставится после атома, к которому он применяется.
Синтаксис
// Greedy
atom?
atom*
atom+
atom{count}
atom{min,}
atom{min,max}
// Non-greedy
atom??
atom*?
atom+?
atom{count}?
atom{min,}?
atom{min,max}?
Примечание: Добавление ? после {count} синтаксически допустимо, но практически бесполезно. Поскольку {count} всегда соответствует ровно count раз, atom{count}? ведет себя так же, как atom{count}.
Параметры
-
atom - Один атом.
-
count - Неотрицательное целое число. Количество раз, которое атом должен быть повторен.
-
min - Неотрицательное целое число. Минимальное количество раз, которое атом может быть повторен.
-
maxНеобязательно - Неотрицательное целое число. Максимальное количество раз, которое атом может быть повторен. Если опущено, атом может быть повторен столько раз, сколько необходимо.
Описание
Квантификатор ставится после атома, чтобы повторить его определенное количество раз. Он не может существовать самостоятельно. Каждый квантификатор способен указать минимальное и максимальное количество повторений шаблона.
| Квантификатор | Минимум | Максимум |
|---|---|---|
? | 0 | 1 |
* | 0 | Бесконечность |
+ | 1 | Бесконечность |
{count} | count | count |
{min,} | min | Бесконечность |
{min,max} | min | max |
Для синтаксисов {count}, {min,} и {min,max} между числами не должно быть пробелов — иначе это станет буквенным шаблоном.
const re = /a{1, 3}/;
re.test("aa"); // false
re.test("a{1, 3}"); // true
Это поведение исправлено в режиме с учетом Unicode, где фигурные скобки не могут появляться буквально без экранирования. Возможность использовать { и } буквально без экранирования является устаревшим синтаксисом для совместимости с веб-сайтами, и на него не следует полагаться.
/a{1, 3}/u; // SyntaxError: Invalid regular expression: Incomplete quantifier
Если минимальное значение превышает максимальное, возникает синтаксическая ошибка.
/a{3,2}/; // SyntaxError: Invalid regular expression: numbers out of order in {} quantifier
Квантификаторы могут приводить к многократному совпадению захватывающих групп. Дополнительную информацию о поведении в этом случае см. на странице, посвященной захватывающим группам.
Каждое повторное совпадение не обязательно должно быть одной и той же строкой.
/[ab]*/.exec("aba"); // ['aba']
Квантификаторы по умолчанию являются жадными, что означает, что они пытаются совпасть как можно больше раз, пока не будет достигнут максимум или пока дальнейшее совпадение невозможно. Вы можете сделать квантификатор нежадным, добавив после него ?. В этом случае квантификатор будет пытаться совпасть как можно меньше раз, совпав большее количество раз только в том случае, если невозможно совпасть оставшуюся часть шаблона при таком количестве повторений.
/a*/.exec("aaa"); // ['aaa']; the entire input is consumed
/a*?/.exec("aaa"); // ['']; it's possible to consume no characters and still match successfully
/^a*?$/.exec("aaa"); // ['aaa']; it's not possible to consume fewer characters and still match successfully
Однако, как только регулярное выражение успешно совпало со строкой по какому-либо индексу, оно не будет пытаться использовать последующие индексы, хотя это может привести к потреблению меньшего количества символов.
/a*?$/.exec("aaa"); // ['aaa']; the match already succeeds at the first character, so the regex never attempts to start matching at the second character
Жадные квантификаторы могут пытаться меньше повторений, если в противном случае невозможно совпадение оставшейся части шаблона.
/[ab]+[abc]c/.exec("abbc"); // ['abbc']
В этом примере [ab]+ сначала жадно совпадает с "abb", но [abc]c не может совпасть с оставшейся частью шаблона ("c"), поэтому квантификатор сокращается до совпадения только "ab".
Жадные квантификаторы избегают бесконечного совпадения пустых строк. Если достигнуто минимальное количество совпадений, и атом в данной позиции не потребляет больше символов, квантификатор прекращает совпадение. Именно поэтому /(a*)*/.exec("b") не приводит к бесконечному циклу.
Жадные квантификаторы пытаются максимально увеличить количество совпадений; они не максимизируют длину совпадения. Например, /(aa|aabaac|ba)*/.exec("aabaac") совпадает с "aa", а затем с "ba", а не с "aabaac".
Квантификаторы применяются к одному атому. Если вы хотите квантифицировать более длинный шаблон или дизъюнкцию, вы должны сгруппировать его. Квантификаторы не могут применяться к утверждениям.
/^*/; // SyntaxError: Invalid regular expression: nothing to repeat
В режиме с учетом Unicode утверждения просмотра вперед могут быть квантифицированы. Это устаревший синтаксис для совместимости с веб-сайтами, и на него не следует полагаться.
/(?=a)?b/.test("b"); // true; the lookahead is matched 0 time
Примеры
Удаление HTML-тегов
Следующий пример удаляет HTML-теги, заключенные в угловые скобки. Обратите внимание на использование ?, чтобы избежать одновременного потребления слишком большого количества символов.
function stripTags(str) {
return str.replace(/<.+?>/g, "");
}
stripTags("<p><em>lorem</em> <strong>ipsum</strong></p>"); // 'lorem ipsum'
Тот же эффект может быть достигнут с помощью жадного совпадения, но с запретом повторения шаблона для совпадения >.
function stripTags(str) {
return str.replace(/<[^>]+>/g, "");
}
stripTags("<p><em>lorem</em> <strong>ipsum</strong></p>"); // 'lorem ipsum'
Предупреждение: Это только для демонстрации — оно не обрабатывает > в атрибутах. Вместо этого используйте правильный санитайзер HTML, такой как API санитайзера HTML.
Поиск абзацев Markdown
В Markdown абзацы разделены одной или несколькими пустыми строками. Следующий пример подсчитывает все абзацы в строке, находя совпадения для двух или более переносов строк.
function countParagraphs(str) {
return str.match(/(?:\r?\n){2,}/g).length + 1;
}
countParagraphs(`
Paragraph 1
Paragraph 2
Containing some line breaks, but still the same paragraph
Another paragraph
`); // 3
Предупреждение: Это только для демонстрации — оно не обрабатывает переносы строк в блоках кода или других блочных элементах Markdown, таких как заголовки. Вместо этого используйте правильный парсер Markdown.
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные | Сервер | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | ||
quantifier |
1 |
12 |
1 |
5 |
1 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
См. также
© 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/Quantifier