Программирование. Принципы и практика использования C++ Исправленное издание, стр. 326
\w{2}–\d{4,5}
соответствует только строкам, содержащим две буквы и дефис, за которым следуют четыре или пять цифр:
Ab–1234
XX–54321
22–54321
но не
Ab–123
?b–1234
Да, цифры задаются символами \w.
23.8.4. Группировка
Для того чтобы указать, что некое регулярное выражение является частичным шаблоном (sub-pattern), его следует заключить в круглые скобки. Рассмотрим пример.
(\d*:)
Данное выражение определяет частичный шаблон, не содержащий ни одной или содержащий несколько цифр, за которыми следует двоеточие. Группу можно использовать как часть более сложного шаблона. Рассмотрим пример.
(\d*:)?(\d+)
Данное выражение задает необязательную и, возможно, пустую последовательность цифр, за которыми следуют двоеточие и последовательность из одной или нескольких цифр. Этот лаконичный и точный способ выражения шаблонов изобрели обычные люди!
23.8.5. Варианты
Символ “или” (|) задает альтернативу. Рассмотрим пример.
Subject: (FW:|Re:)?(.*)
Это выражение распознает тему сообщения электронной почты с необязательными символами FW: или Re:, за которыми может не стоять ни одного символа или может стоять несколько символов. Рассмотрим пример.
Subject: FW: Hello, world!
Subject: Re:
Subject: Norwegian Blue
но не
SUBJECT: Re: Parrots
Subject FW: No subject!
Пустая альтернатива не допускается.
(|def)
// ошибкаОднако мы можем указать несколько альтернатив сразу.
(bs|Bs|bS|BS)
23.8.6. Наборы символов и диапазоны
Специальные символы представляют собой обозначение наиболее распространенных классов символов: цифр (\d); букв, цифр и знака подчеркивания (\w) и др. (см. раздел 23.7.2). Однако часто бывает полезно определить свой собственный специальный символ. Сделать это очень легко. Рассмотрим пример.

В спецификации класса символов дефис (–) используется для указания диапазона, например, [1–3] (1, 2 или 3) и [w–z] (w, x, y или z). Пожалуйста, будьте аккуратны при использовании таких диапазонов: не все языки содержат одинаковые буквы, и порядки их следования в алфавитах разных языков могут отличаться. Если вам необходим диапазон, не являющийся частичным диапазоном букв и цифр, принятых в английском языке, то обратитесь к документации.
Следует подчеркнуть, что мы используем специальные символы, такие как \w (означающий “любой словообразующий символ”), в спецификации класса символов. Как же нам вставить обратную косую черту (\) в класс символов? Как обычно, превращаем ее в управляющий символ: \\.
^^
В последнем регулярном выражении символ ^ стоит не на первом месте после квадратной скобки ([), значит, это простой символ, а не оператор отрицания. Регулярные выражения могут быть очень хитроумными.
Реализация библиотеки
regex[[:alnum:]]"[[:alnum:]]+string s = "\"[[:alnum:]]+\"";Более того, чтобы поместить строковый литерал в объект класса
regexregexregex s("\\\"[[:alnum:]]+\\\"");Использование регулярных выражений вынуждает вводить множество обозначений. Перечислим стандартные классы символов.

Реализация библиотеки
regex23.8.7. Ошибки в регулярных выражениях
Что произойдет, если мы зададим неправильное регулярное выражение? Рассмотрим пример.
regex pat1("(|ghi)"); // пропущенный оператор альтернативыregex pat2("[c–a]"); // не диапазонКогда мы присваиваем шаблон объекту класса
regexbad_expressionРассмотрим небольшую программу, позволяющую исследовать механизм сравнения регулярных выражений.
#include <boost/regex.hpp>#include <iostream>#include <string>#include <fstream>#include<sstream>using namespace std;using namespace boost; // если вы используете реализацию библиотеки // boost