На этом шаге рассмотрим класс 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.
Предыдущий шаг
Содержание
Следующий шаг