Клиентские сценарии. Использование регулярных выражений
Регулярные выражения
Регулярные выражения — система поиска текстовых фрагментов в электронных документах, основанная на специальной системе записи образцов для поиска.
Образец, задающий правило поиска, называется "шаблоном". Применение регулярных выражений принципиально преобразило технологии электронной обработки текстов.
С помощью регулярных выражений можно задавать структуру искомого шаблона и его позицию внутри строки (например, в начале или в конце строки, на границе или не на границе слова).
При описании структуры шаблона используются:
- гибкая система квантификаторов (операторов повторения);
- операторы описания наборов символов и их типа (числовые, нечисловые, специальные).
Для того, чтобы задать положение искомого фрагмента внутри строки, можно использовать один из следующих операторов:
| Представление | Позиция |
| ^ | Начало строки |
| $ | Конец строки |
| \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>
формально соответствует указанному выше шаблону
Для решения данной проблемы можно использовать два подхода.
- В регулярном выражении учитываются символы, не соответствующие желаемому образцу (например, <[^>]*> для вышеописанного случая).
- Определение квантификатора как нежадного (ленивого) - большинство реализаций позволяют это сделать, добавив после него знак вопроса.
Например, по шаблону ( <.*?> ) будут найдены все теги из рассмотренной строки.
Таким образом, получаются следующие "нежадные" модификации квантфикаторов:
| Модификатор | Описание | ||
| *? | "не жадный" эквивалент * | ||
| +? | "не жадный" эквивалент + | ||
| {n,}? | "не жадный" эквивалент {n,} |
Следует, однако, иметь в виду, что использование "ленивых" квантификаторов может привести к ситуации, когда выражению соответствует слишком короткая, в частности, пустая строка.