JavaScript | Квантификаторы *(звёздочка), +(плюс), ?(вопрос)

JavaScript | Квантификаторы *(звёздочка), +(плюс), ?(вопрос)

В этой публикации мы рассмотрим три префикса квантификатора для дизъюнкций шаблона регулярного выражения, которые обозначаются так:

  • * (звёздочка)
  • + (плюс)
  • ? (вопрос)

 

По стандарту 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