Опубликован: 19.07.2010 | Доступ: свободный | Студентов: 1670 / 148 | Оценка: 4.07 / 3.43 | Длительность: 20:59:00
Лекция 5:

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 Любой символ (кроме неотображаемых символов)

Для группировки отдельных частей шаблона можно использовать следующие операторы:

Оператор Описание
( ) Поиск группы символов внутри скобок и сохранение найденного соответствия
(?: ) Поиск группы символов внутри скобок без сохранения найденного соответствия
| Комбинирование частей в одно выражения с последующим поиском любой из частей в отдельности. Аналогично оператору "ИЛИ".

Если шаблон поиска включает специальные (как правило неотображаемые) символы, для их описания можно использовать следующие обозначения:

Обозначение Описание
\0 Символ с нулевым кодом
\n Символ новой строки
\r Символ начала строки
\t Символ табуляции
\v Символ вертикальной табуляции
\xxx Символ, имеющий заданный восьмеричный ASCII код xxx
\xdd Символ, имеющий заданный шестнадцатиричный ASCII код dd
\uxxxx Символ, имеющий ASCII код выраженный ЮНИКОДОМ xxxx

Квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (т.е. квантификаторы являются "жадными"). Это может приводить к некоторым проблемам. Например, шаблон ( <.*> ) описывающий на первый взгляд теги HTML на самом деле будет выделять более крупные фрагменты в документе.

Например, строка вида

<p><font color='blue'><i>Регулярные выражения<i></font> - удобный инструмент для поиска в строках </p>

формально соответствует указанному выше шаблону

Для решения данной проблемы можно использовать два подхода.

  1. В регулярном выражении учитываются символы, не соответствующие желаемому образцу (например, <[^>]*> для вышеописанного случая).
  2. Определение квантификатора как нежадного (ленивого) - большинство реализаций позволяют это сделать, добавив после него знак вопроса.

Например, по шаблону ( <.*?> ) будут найдены все теги из рассмотренной строки.

Таким образом, получаются следующие "нежадные" модификации квантификаторов:

Квантификатор Описание
*? "не жадный" эквивалент *
+? "не жадный" эквивалент +
{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 применяется для изменения ранее созданного шаблона.

Аргументом в последних трех методах является строка, в которой выполняется поиск по шаблону.