В этой публикации мы рассмотрим три префикса квантификатора для дизъюнкций шаблона регулярного выражения, которые обозначаются так:
- * (звёздочка)
- + (плюс)
- ? (вопрос)
По стандарту ECMAScript эти три префикса квантификатора имеют следующее производство:
Производство префикса QuantifierPrefix :: * оценивается следующим образом:
1. Верните два результата: 0 и +∞.
Производство префикса QuantifierPrefix :: + оценивается следующим образом:
1. Верните два результата: 1 и +∞.
Производство префикса QuantifierPrefix :: ? оценивается следующим образом:
1. Верните два результата 0 и 1.
Префикс Квантификатора — *
Попытается сопоставить шаблон при повторении символов дизъюнкции от нуля до бесконечности раз.
Видео
Пример с одним символом
var stroka = "e-ef-efi-efim-ex-ey-fe"
stroka.replace(/f*/,"") "e-ef-efi-efim-ex-ey-fe"
Результат совпадает с оригинальной строкой, потому что «нулевое количество символов f» встречается в самом начале строки. Это значит, что регулярное выражение нашло первое сопоставление подходящее под шаблон и выполнило замену методом replace().
stroka.replace(/f*/g,"") "e-e-ei-eim-ex-ey-e"
В этом случае мы использовали глобальный флаг «g«, чтобы продолжать сопоставлять шаблон по всей строке при каждом нахождении соответствия слева-направо.
Пример с двумя символами
Мы хотим найти и заменить те места в строке, где после символа «e«, либо есть, либо нет повторений символа «f»
var stroka = "e-ef-efi-efim-ex-ey-fe"
stroka.replace(/ef*/,"") "-ef-efi-efim-ex-ey-fe"
Мы не увидим первый символ строки т. к. он был заменён. Регулярное выражение нашло первое сопоставление в строке при котором после символа «e» стоит символ «f» ноль раз (т. е. не стоит).
stroka.replace(/ef*/g,"") "--i-im-x-y-f"
В этом случае мы использовали глобальный флаг для полного сопоставления всей строки и замены всех сопоставлений. Почему мы видим последний символ «f«? Потому что в оригинальной строке перед символом «f» не стоял символ «e«.
Префикс Квантификатора — +
Попытается сопоставить шаблон при повторении символов дизъюнкции от одного до бесконечности раз.
Видео
Пример с одним символом
var stroka = "kekkfkkkikkkkmk"
stroka.replace(/k+/,"") "ekkfkkkikkkkmk"
stroka.replace(/k+/g,"") "efim"
stroka.replace(/k/g,"") "efim"
Обычная дизъюнкция даёт точно такой же результат. Так в чём разница? Зачем нужен префикс квантификатора?
Пример с двумя символами
var stroka = "ef-kk-efff-ifff-mf"
stroka.replace(/ef+/,"") "-kk-efff-ifff-mf"
stroka.replace(/ef+/g,"") "-kk--ifff-mf"
Удалили в строке те места, где после символа «e» встречается символ «f» один или бесконечно много раз.
Префикс Квантификатора — ?
Попытается сопоставить шаблон при повторении символов дизъюнкции от нуля до одного раза.
Видео
Пример
var stroka = "e-ef-eff"
stroka.replace(/ef?/, "") "-ef-eff"
Шаблон сопоставится один раз на первом символе строки
stroka.replace(/ef?/g, "") "--f"
Шаблон сопоставится глобально — 3 раза на всей строке.
Информационные ссылки
JavaScript | Квантификатор {} фигурные скобки в регулярных выражениях
ECMAScript | Квантификатор (Quantifier) | Регулярные выражения (Regular Expression)
Стандарт ECMAScript — Раздел «Quantifier» — https://tc39.es/ecma262/#sec-quantifier