В этой публикации мы рассмотрим три префикса квантификатора для дизъюнкций шаблона регулярного выражения, которые обозначаются так:
- * (звёздочка)
- + (плюс)
- ? (вопрос)
По стандарту 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