На этом шаге рассмотрим класс QRegExp.
Для работы с регулярными выражениями Qt предоставляет класс QRegExp. Регулярные выражения — это мощное средство анализа и обработки строк. Они содержат в себе шаблон, предназначенный для поиска в строке. Это позволяет быстро и гибко извлекать совпавший с шаблоном текст. Но следует заметить, что работа с регулярными выражениями производится медленнее методов, определенных в классе QString, и поэтому их применение должно быть обоснованным. Таблица 1 содержит основные шаблонные символы, поддерживаемые классом QRegExp.
Любой символ | a.b | |
Должен быть конец строки | Abc$ | |
Любой символ из заданного набора | [abc] | |
Определяет диапазон символов в группе [ ] | [0-9A-Za-z] | |
В начале набора символов означает любой символ, не вошедший в набор | [^def] | |
Символ должен встретиться в строке ни разу или несколько раз | A*b | |
Символ должен встретиться в строке минимум 1 раз | A+b | |
Символ должен встретиться в строке 1 раз или не встретиться вообще | A?b | |
Символ должен встретиться в строке указанное число раз | A{3}b | |
Допускается минимум n совпадений | a{3,}b | |
Допускается до n совпадений | a{,3}b | |
Допускается от n до m совпадений | a{2,3}b | |
Ищет один из двух символов | ac|bc | |
В этом месте присутствует граница слова | a\b | |
Границы слова нет в этом месте | a\Bd | |
Ищет и сохраняет в памяти группу найденных символов | (ab|ac)ad | |
Любое число | ||
Все, кроме числа | ||
Любой тип пробелов | ||
Все, кроме пробелов | ||
Любая буква, цифра или знак подчеркивания | ||
Все, кроме букв | ||
Начало строки | ||
Целое слово | ||
Не слово | ||
Конец строки (совпадает с символом конца строки или перед символом перевода каретки) | ||
Конец строки (совпадает только с концом строки) |
Для того чтобы найти один из нескольких символов, нужно поместить их в квадратные скобки. Например [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.