# Квантификаторы +, * и ?
Для самые часто востребованных квантификаторов есть специальные короткие обозначения.
[cut]
- `+`
- Означает "один или более", то же что `{1,}`.
Например,
\d+
находит числа -- последовательности из 1 или более цифр:
```js
//+ run
var str = "+7(903)-123-45-67";
alert( str.match( /\d+/g ) ); // 7,903,123,45,67
```
- `?`
- Означает "ноль или один", то же что и `{0,1}`. По сути, делает символ необязательным.
Например,
ou?r
найдёт or
в слове color
и our
в его британском варианте написания colour
.
```js
//+ run
var str = "Можно писать color или colour";
alert( str.match( /colou?r/g ) ); // color, colour
```
- `*`
- Означает "ноль или более", то же что `{0,}`. То есть, символ может повторяться много раз или вообще отсутствовать.
Пример ниже находит цифру, после которой идёт один или более нулей:
```js
//+ run
alert( "100 10 1".match( /\d0*/g ) ); // 100, 10, 1
```
Сравните это с `'+'` (один или более):
```js
//+ run
alert( "100 10 1".match( /\d0+/g ) ); // 100, 10
```
Эти квантификаторы -- одни из важнейших "строительных блоков" для сложных регулярных выражений, поэтому мы рассмотрим ещё примеры.
- Десятичная дробь (число с точкой внутри):
\d+\.\d+
-
```js
//+ run
alert( "0 1 12.345 7890".match( /\d+\.\d+/g ) ); // 123.45
```
- Открывающий HTML-тег без атрибутов, такой как `` или `
`: /<[a-z]+>/i
- Пример:
```js
//+ run
alert( " ... ".match ( /<[a-z]+>/gi ) ); //
```
Это регулярное выражение ищет символ
'<'
, за которым идут одна или более букв английского алфавита, и затем '>'
.
- Открывающий HTML-тег без атрибутов (лучше):
/<[a-z][a-z0-9]*>/i
-
Здесь регулярное выражение расширено: в соответствие со стандартом, HTML-тег может иметь символ на любой позиции, кроме первой, например `
`.
```js
//+ run
alert( "Привет!
".match( /<[a-z][a-z0-9]*>/gi ) ); //
```
- Открывающий или закрывающий HTML-тег без атрибутов:
/<\/?[a-z][a-z0-9]*>/i
- В предыдущий паттерн добавили необязательный слэш
/?
перед тегом. Его понадобилось заэкранировать, чтобы JavaScript не принял его за конец шаблона.
```js
//+ run
alert( "Привет!
".match( /<\/?[a-z][a-z0-9]*>/gi ) ); // ,
```
[smart header="Точнее -- значит сложнее"]
Здесь мы видим классическую ситуацию, которая повторяется из раза в раз.
Чем точнее регулярное выражение, тем оно длиннее и сложнее.
Например, для HTML-тегов, скорее всего, подошло бы и более короткое регулярное выражение <\w+>
.
Так как класс `\w` означает "любая цифра или английская буква или _`, то под такой шаблон подойдут и не теги, например <_>
, однако он гораздо проще, чем <[a-z][a-z0-9]*>
.
Подойдёт ли нам <\w+>
или нужно использовать именно <[a-z][a-z0-9]*>
?
В реальной жизни допустимы оба варианта. Ответ на подобные вопросы зависит от того, насколько реально важна точность и насколько сложно потом будет отфильтровать лишние совпадения (если появятся).
[/smart]