JavaScript - язык разработки клиентских веб-приложений
Регулярные выражения
Регулярные выражения - система поиска текстовых фрагментов в электронных документах, основанная на специальной системе записи образцов для поиска.
Образец, задающий правило поиска, называется " шаблоном ". Применение регулярных выражений принципиально преобразило технологии электронной обработки текстов.
С помощью регулярных выражений можно задавать структуру искомого шаблона и его позицию внутри строки (например, в начале или в конце строки, на границе или не на границе слова).
При описании структуры шаблона используются:
- гибкая система квантификаторов (операторов повторения);
- операторы описания наборов символов и их типа (числовые, нечисловые, специальные).
Для того, чтобы задать положение искомого фрагмента внутри строки, можно использовать один из следующих операторов:
Представление | Позиция |
---|---|
^ | Начало строки |
$ | Конец строки |
\b | Граница слова |
\B | Не граница слова |
(?=шаблон) | Искомая строка следует после указанной строки (с просмотром вперед) |
(?!=шаблон) | Искомая строка не следует после указанной строки (с просмотром вперед) |
(?<=шаблон) | Искомая строка следует после указанной строкой (с просмотром назад) |
(?<!шаблон) | Искомая строка не следует после указанной строки (с просмотром назад) |
Кроме того, язык регулярных выражений предоставляет набор квантификаторов, позволяющих указать число повторений шаблона:
Представление | Число повторений |
---|---|
{n} | Ровно n |
{m, n} | От m до n включительно |
{m,} | Не менее m |
{,n} | Не более n |
Имеются и более простые квантификаторы:
Представление | Число повторений | Эквивалент |
---|---|---|
* | Ноль или более | {0,} |
+ | Одно или более | {1,} |
? | Ноль или одно | {0,1} |
Для задания внутри шаблона группы символом можно использовать следующие операторы:
Оператор | Описание |
---|---|
[xyz] | Любой символ из указанного множества |
[^xyz] | Любой символ не входящий в указанное множество |
[x-z] | Любой символ из указанного диапазона |
[^x-z] | Любой символ не входящий в указанный диапазон |
. (точка) | Любой символ кроме символов разрыва или переноса строки |
\w | Любой буквенно-цифровой символ, включая символ подчеркивания |
\W | Любой не буквенный символ |
\d | Любая цифра |
\D | Любой нецифровой символ |
\s | Любой не отображаемый символ |
\S | Любой символ (кроме неотображаемых символов) |
Для группировки отдельных частей шаблона можно использовать следующие операторы:
Оператор | Описание |
---|---|
( ) | Поиск группы символов внутри скобок и сохранение найденного соответствия |
(?: ) | Поиск группы символов внутри скобок без сохранения найденного соответствия |
| | Комбинирование частей в одно выражения с последующим поиском любой из частей в отдельности. Аналогично оператору "ИЛИ". |
Если шаблон поиска включает специальные (как правило неотображаемые) символы, для их описания можно использовать следующие обозначения:
Квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (т.е. квантификаторы являются "жадными"). Это может приводить к некоторым проблемам. Например, шаблон ( <.*> ) описывающий на первый взгляд теги HTML на самом деле будет выделять более крупные фрагменты в документе.
Например, строка вида
<p><font color='blue'><i>Регулярные выражения<i></font> - удобный инструмент для поиска в строках </p>
формально соответствует указанному выше шаблону
Для решения данной проблемы можно использовать два подхода.
- В регулярном выражении учитываются символы, не соответствующие желаемому образцу (например, <[^>]*> для вышеописанного случая).
- Определение квантификатора как нежадного (ленивого) - большинство реализаций позволяют это сделать, добавив после него знак вопроса.
Например, по шаблону ( <.*?> ) будут найдены все теги из рассмотренной строки.
Таким образом, получаются следующие "нежадные" модификации квантификаторов:
Квантификатор | Описание |
---|---|
*? | "не жадный" эквивалент * |
+? | "не жадный" эквивалент + |
{n,}? | "не жадный" эквивалент {n,} |
Следует, однако, иметь в виду, что использование "ленивых" квантификаторов может привести к ситуации, когда выражению соответствует слишком короткая, в частности, пустая строка.
Примеры регулярных выражений.
- Дата в формате yyyy-MM-dd:
20\d\d\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])
-
IP адрес:
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
- Доменное имя:
^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$
- Вещественное число:
[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?
- Запись числа в римской системе счисления:
^(?i:(?=[MDCLXVI])((M{0,3})((C[DM])|(D?C{0,3}))?((X[LC])|(L?XX{0,2})|L)?((I[VX])|(V?(II{0,2}))|V)?))$
Регулярные выражения в JavaScript
При поиске по тексту можно использовать шаблон, описывающий подстроку. В JavaScript такой шаблон может быть описан с помощью объекта RegExp. В простейшем случае такой шаблон описывает отдельный символ, однако имеет смысл его использовать для регулярных выражений.
Для объекта RegExp поддерживаются следующие методы:
- Конструктор RegExp. В аргументе задается регулярное выражение.
- Метод test выполняет поиск по шаблону.
- Метод exec выполняет поиск подстроки по шаблону и возвращает найденные соответствия; если соответствий нет, возвращается значение null.
- Метод compile применяется для изменения ранее созданного шаблона.
Аргументом в последних трех методах является строка, в которой выполняется поиск по шаблону.