Шаг 55.
Библиотека Qt.
Класс QRegExp

    На этом шаге рассмотрим класс QRegExp.

    Для работы с регулярными выражениями Qt предоставляет класс QRegExp. Регулярные выражения — это мощное средство анализа и обработки строк. Они содержат в себе шаблон, предназначенный для поиска в строке. Это позволяет быстро и гибко извлекать совпавший с шаблоном текст. Но следует заметить, что работа с регулярными выражениями производится медленнее методов, определенных в классе QString, и поэтому их применение должно быть обоснованным. Таблица 1 содержит основные шаблонные символы, поддерживаемые классом QRegExp.

Таблица 1. Шаблоны регулярных выражений
Символ
Описание
Пример
.
Любой символ a.b
$
Должен быть конец строки Abc$
[ ]
Любой символ из заданного набора [abc]
-
Определяет диапазон символов в группе [ ] [0-9A-Za-z]
^
В начале набора символов означает любой символ, не вошедший в набор [^def]
*
Символ должен встретиться в строке ни разу или несколько раз A*b
+
Символ должен встретиться в строке минимум 1 раз A+b
?
Символ должен встретиться в строке 1 раз или не встретиться вообще A?b
{n}
Символ должен встретиться в строке указанное число раз A{3}b
{n,}
Допускается минимум n совпадений a{3,}b
{,n}
Допускается до n совпадений a{,3}b
{n,m}
Допускается от n до m совпадений a{2,3}b
|
Ищет один из двух символов ac|bc
\b
В этом месте присутствует граница слова a\b
\B
Границы слова нет в этом месте a\Bd
( )
Ищет и сохраняет в памяти группу найденных символов (ab|ac)ad
\d
Любое число  
\D
Все, кроме числа  
\s
Любой тип пробелов  
\S
Все, кроме пробелов  
\w
Любая буква, цифра или знак подчеркивания  
\W
Все, кроме букв  
\A
Начало строки  
\b
Целое слово  
\B
Не слово  
\Z
Конец строки (совпадает с символом конца строки или перед символом перевода каретки)  
\z
Конец строки (совпадает только с концом строки)  

    Для того чтобы найти один из нескольких символов, нужно поместить их в квадратные скобки. Например [ab] будет совпадать с a или b. Чтобы не писать все символы подряд, можно указать диапазон, например [A-Z] совпадает с любой буквой в верхнем регистре, [a-z] — с любой буквой в нижнем регистре, а [0-9] — с любой цифрой. Можно совмещать такие записи, например, [a-z7] будет совпадать с любой буквой в нижнем регистре и с цифрой 7.

    Также можно исключать символы, поставив перед ними знак ^. Например [^0-9] будет соответствовать всем символам, кроме цифр.

    Указанные в табл. 1 величины в фигурных скобках называются пределами. Пределы позволяют точно задать количество раз, которое символ должен повторяться в тексте. Например, a{4,5} будет совпадать с текстом, если буква a встретится в нем не менее 4, но не более 5 раз подряд. Например, в следующем отрывке задано регулярное выражение для ip-адреса, им можно воспользоваться, например, для того, чтобы проверить строку на содержание в ней ip-адреса:

QRegExp reg("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}");
QString str("это строка содержит ip-адрес 123.222.63.1");
qDebug() << (str.contains(reg) > 0); //true 

    Обратите внимание, что для указания символа точки в регулярном выражении перед ним стоит обратная косая черта (\), а в соответствии с правилами языка С++ для ее задания в строке она должна удваиваться. Если бы косой черты не было, то точка имела бы в соответствии с табл. 1 значение "любой символ", и регулярное выражение распознавало бы, например, строку "1z2y3x4", как ip-адрес, что, разумеется, не правильно.

    Шаблоны можно комбинировать при помощи символа |, задавая ветвления в регулярном выражении. Регулярное выражение с двумя ветвями совпадает с подстрокой, если совпадает одна из ветвей. Например:

QRegExp rxp("(.com|.ru)");
int n1 = rxp.indexIn("www.bhv.ru"); // n1 = 7 (совпадение на 7-й позиции)
int n2 = rxp.indexIn("www.bhv.de"); // n2 = -1 (совпадений не найдено)   

    Указанные в табл. 1 символы с обратной косой чертой (обратным слэшем) позволяют значительно упростить регулярные выражения. Например, регулярное выражение [a-zA-Z0-9_] идентично выражению \w.

    На следующем шаге рассмотрим класс QString.




Предыдущий шаг Содержание Следующий шаг