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

Их список приведен в конце этой части. Важно понимать то обстоятельство, что несмотря на некий общий набор правил конкретные реализации регулярных выражений могут отличаться. Имеется в виду, что встроенную поддержку регулярных выражений имеют разные языки. Среди них ActionScript, Perl, Java,PHP, JavaScript, языки платформы .NET Framework, Python, Tcl, Ruby, Lua, Gambas, C (стандарт 2011 года), Delphi, D и другие.

Т.е. существуют общие правила и существуют некие особенности трактовки в конкретном языке. Но общего все же больше.

Буквы и цифры

\d обозначает любую цифру от 0 до 9;

\d\d\d - три любых цифры.

a-z обозначает любую букву латинского алфавита в нижнем регистре, A-Z тоже самое, но в верхнем регистре.

Буквы можно объединить. Например. a-zA-Z означает любая буква латинского алфавита. Для русского алфавита любая буква обозначается а-яА-Я. Конструкция a-zA-Zа-яА-Я0-9.,:; означает все буквы и цифры, а также перечисленные знаки препинания.

Кроме букв есть обозначения для других символов. \s означает один пробел. ^ - символ отрицания, меняющий смысл на противоположный. Например, ^\d означает любой символ, кроме цифры

Синтаксис 

Представление Эквивалент Значение
\d [0-9] Любая цифра
\D [^\d] Любой символ, кроме цифры
 \w [A-Za-zА-Яа-я0-9] Символы, образующие «слово» (буквы, цифры)
 \W  [^\w]  Символы, не образующие «слово»
 \s  [ \t\v\r\n\f] Пробельный символ
 \S  [^\s] Непробельный символ
 .   Соответствует любому единственному символу
( ... )   Оператор группы

Специальные символы

\xnn символ с шестнадцатеричным кодом nn
\x{nnnn} символ с шестнадцатеричным кодом nnnn (более одного байта можно задавать только в режиме Unicode)
\t табуляция (HT/TAB), можно также \x09
\n новая строка (NL), можно также \x0a
\r возврат каретки (CR), можно также \x0d
\f перевод формата (FF), можно также \x0c
\a звонок (BEL), можно также \x07
\e escape (ESC), можно также \x1b

Перечисление и группировка

Вертикальная черта разделяет допустимые варианты. Например, «дача|дата» соответствует дача или дата. Круглые скобки используются для определения области действия и приоритета операторов. Например, «дача|дата» и «да(ч|т)а» являются разными образцами, но они оба описывают множество, содержащее дача и дата.

Квантификация

Квантификатор после символа или группы определяет, сколько раз предшествующее выражение может встречаться.

{m,n} общее выражение, повторений может быть от m до n включительно
{m,} общее выражение, m и более повторений
{,n} общее выражение, не более n повторений
? Знак вопроса означает 0 или 1 раз, то же самое, что и {0,1}. Например, «colou?r» соответствует и color, и colour
* Звёздочка означает 0, 1 или любое число раз ({0,}). Например, «go*gle» соответствует ggle, gogle, google и др.
Плюс означает хотя бы 1 раз ({1,}). Например, «go gle» соответствует gogle, google и т. д. (но не ggle)
Таким образом \d означает любые цифры; .\d любой символ с цифрой.

При поиске в TextPipe для отделения специальных символов от просто символов используется обратный слэш \. Например, если . это любой символ, то \. обозначает просто точку. \/ обозначает прямой слэш. Для обозначения самого обратного слэша используют двойной обратный слэш \\.

Примеры регулярных выражений

Некоторые базовые примеры поиска регулярных выражений

Чему соответствует Оператор Примеры
Любой одиночный символ . g.t находит get, got, gut, together
Любые одиночные символы (один или больше) + w+e находит wide, white, write и we more (используется наиболее длинное возможное соответствие)
Любая цепочка символов (или ничего) * w*e согласуется с wide, white, write, we и wherever (используется наиболее длинное возможное соответствие)
Один из указанных символов [] g[eo]t соответствует get и got но не gut
Один из символов диапазона [-] [b-p]at соответствует bat, cat, fat, hat, mat но не rat или sat
Одно или другое выражение (|) W(in|indows) соответствует Win или Windows
Одно или больше выражений () + (at)+ соответствует atat в catatonic и at в battle
Все символы (возможно в разных строках) .* h.*d  соответствует helped, Hello World, & Hello (cr lf) Win95 World
Две цепочки “рядом” (возможно в разных строках) .* the[\0-я]*first соответствует the first и the (cr lf) very first
Один из символов вне диапазона [^-] [^b-p]at соответствует at в rat & sat и не соответствует в bat, cat, fat, hat
Поиск всех слов с длинной x [^\w]\w\w\w+ будет находить все слова из трех букв
  [^\w]a\w\w\w\w находит все слова из 5 букв, начинающиеся с буквы ‘a’

Дополнительные примеры регулярных выражений поисков

Регулярное выражение Результаты поиска
L. line, list, lane, LogVar1 (когда отключен учет регистра букв)
[on][on] non, no, on
\[ [
[a-z]+ abcdefghijklomopqrstuvwxyz Примечание: если отключен учет регистра букв, это также будет соответствовать ABCDEFGHIJKLMNOPQRSTUVWXYZ
[a-zA-ZА-я] Соответствие такое же как +[a-z] в примере выше (независимо от флага учета регистра букв), а также всем другим специальным символам для западноевропейских языков.
(one|two|three)+ one, onetwo, twothree
(one|two|three) one, two, three
Windows[\0-я]*95 Будет соответствовать символам до 4096 символов (в нескольких строках) между словами Windows и 95
/\*[\0-я]*\*/ Соответствует комментариям стиля языка C в нескольких строках, если это необходимо (до 4069 символов)
01*[0-9].htm 01346.htm, 01.htm, 016965.htm
.*  символ .* соответствует всем символам
[ab]*c c, abc, bac, abbc, bbac
.include (<|\[)+[a-z0-9_].h*(p)+[\]>]  Соответствует:
#include [stdafx.h]#include <dos.h>
#include [my_include.hpp]#include [sr32.h]

Хорошей возможностью является практика работы в программе TextPipe. Запускаем программу и смотрим, как все работает. В качестве примера можно потренироваться с фильтром Replace (Find Pattern (Perl style)), чтобы была возможность задать регулярное выражение.

Рассмотрим пример. Как известно, HTML страница содержит тэг BODY. Т.е. в ней есть некоторый текст ограниченный этими тэгами. В общем виде код имеет вид:

<HTML>
<HEAD> Произвольный код
</HEAD>
<BODY> Произвольный код
</BODY>
</HTML>

Допустим, перед нами стоит задача извлечь код между тэгами <BODY> Произвольный код </BODY>. Сможем мы это сделать? Пишем регулярное выражение <BODY>.*<BODY> и код наш. Но не тут-то было.

Регулярное выражение в программе сработает, только если между нашими тэгами определенное количество символов! На практике я столкнулся с этой проблемой и опытным путем подобрал число символов, при котором регулярное выражение срабатывает. Это число – 32.757 символов! Допускаю, что я мог немного ошибиться на пару символов. Оно близко к двум в 15-й степени. Возможно, это ограничение как-то заложено в программу. Однако оно есть и с ним надо считаться.