en.javascript.info/10-regular-expressions-javascript/7-regexp-quantifiers/article.md
2015-02-27 13:21:58 +03:00

5.1 KiB
Raw Blame History

Квантификаторы +, * и ?

Для самые часто востребованных квантификаторов есть специальные короткие обозначения.

[cut]

`+`
Означает "один или более", то же что `{1,}`.

Например, \d+ находит числа -- последовательности из 1 или более цифр:

//+ 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.

//+ run
var str = "Можно писать color или colour";

alert( str.match( /colou?r/g ) ); // color, colour
`*`
Означает "ноль или более", то же что `{0,}`. То есть, символ может повторяться много раз или вообще отсутствовать.

Пример ниже находит цифру, после которой идёт один или более нулей:

//+ run
alert( "100 10 1".match( /\d0*/g ) ); // 100, 10, 1

Сравните это с '+' (один или более):

//+ run
alert( "100 10 1".match( /\d0+/g ) ); // 100, 10

Эти квантификаторы -- одни из важнейших "строительных блоков" для сложных регулярных выражений, поэтому мы рассмотрим ещё примеры.

Десятичная дробь (число с точкой внутри): \d+\.\d+
//+ run
alert( "0 1 12.345 7890".match( /\d+\.\d+/g ) ); // 123.45
Открывающий HTML-тег без атрибутов, такой как `` или `

`: /<[a-z]+>/i

Пример:
//+ run
alert( "<BODY> ... </BODY>".match ( /<[a-z]+>/gi ) ); // <BODY>

Это регулярное выражение ищет символ '<', за которым идут одна или более букв английского алфавита, и затем '>'.

Открывающий HTML-тег без атрибутов (лучше): /<[a-z][a-z0-9]*>/i
Здесь регулярное выражение расширено: в соответствие со стандартом, HTML-тег может иметь символ на любой позиции, кроме первой, например `

`.
//+ run
alert( "<h1>Привет!</h1>".match( /<[a-z][a-z0-9]*>/gi ) );  // <h1>

Открывающий или закрывающий HTML-тег без атрибутов: /<\/?[a-z][a-z0-9]*>/i
В предыдущий паттерн добавили необязательный слэш /? перед тегом. Его понадобилось заэкранировать, чтобы JavaScript не принял его за конец шаблона.
//+ run
alert( "<h1>Привет!</h1>".match( /<\/?[a-z][a-z0-9]*>/gi ) );  // <h1>, </h1>

[smart header="Точнее -- значит сложнее"] Здесь мы видим классическую ситуацию, которая повторяется из раза в раз.

Чем точнее регулярное выражение, тем оно длиннее и сложнее.

Например, для HTML-тегов, скорее всего, подошло бы и более короткое регулярное выражение <\w+>.

Так как класс \w означает "любая цифра или английская буква или `, то под такой шаблон подойдут и не теги, например <>, однако он гораздо проще, чем <[a-z][a-z0-9]*>.

Подойдёт ли нам <\w+> или нужно использовать именно <[a-z][a-z0-9]*>?

В реальной жизни допустимы оба варианта. Ответ на подобные вопросы зависит от того, насколько реально важна точность и насколько сложно потом будет отфильтровать лишние совпадения (если появятся). [/smart]