StringValidator/main.cpp
StringValidator/mainwindow.h
StringValidator/mainwindow.cpp
Регулярные выражения(regular expressions, regexp, RE, регэкспы) — система поиска текстовых фрагментов в строках, основанная на специальной системе записи шаблонов для поиска. В библиотеке Qt регулярные выражения представлены объектами класса QRegExp. Для проверки строки на наличие регулярного выражения используется класс QRegExpValidator.
В управляющих последовательностях используется обратная косая черта \. Некоторые символы, используемые при записи регулярных выражений рассматриваются не как обычные символы, а как имеющие специальное значение - метасимволы. Основные метасимволы:
- . (точка) — любой символ, включая новую строку
- \s — пробел(QChar::isSpace())
- \S — не пробел
- \w — текстовый символ (QChar::isLetterOrNumber(), QChar::isMark(), или '_')
- \W — не текстовый символ
- \d — цифра (QChar::isDigit())
- \D — не цифра
- \xhhhh — символ Unicode в шестнадцатеричном виде
- \0ooo — символ ASCII/Latin1 в восьмеричном виде
Необходимо помнить об управляющих последовательностях C++. Они тоже работают. Так так компилятор C++ преобразует обратные косые черты в строки, то \d в С++ необходимо будет записать как \\d, а \\ — \\\\.
По умолчанию выражения имеют квантификатор (1,1), т.е. повторяются 1 раз.
Основные кванторы1:
- Е? — одно или 0 повторений выражения
- E+ — одно или более повторений выражения, тоже, что и E{1,}
- E* — 0 или более повторений выражения, тоже, что и E{0,}
- Е{n} — n повторений, тоже, что и E{n,n}
- E{n,} — n повторений и более
- E{,m} — до m повторений
- E{n,m} — от n до m повторений
Данные квантификаторы являются жадными. Квантификаторы могут быть сделаны не жадными с помощью метода void QRegExp::setMinimal(bool minimal)2
Основные утверждения:
- ^ — начало строки
- $ — конец строки
Допустим, пользователю необходимо ввести номер(вида ABCD-1234-1234) своей карты и телефон. Номер телефона начинается с кода страны, который может иметь одну или 2 цифры; затем , в скобках,следует код города(от 3 до 5 цифр) и наконец сам номер(от 2 до 7 цифр). Составим регулярные выражения:
номер карты — ^[A-Z]{4}\-[0-9]{4}\-[0-9]{4}$
номер телефона — ^\+\d{1,2}\(\d{3,5}\)\d{2,7}$
Строки С++ будут выглядеть ^[A-Z]{4}\\-[0-9]{4}\\-[0-9]{4}$ и ^\\+\\d{1,2}\\(\\d{3,5}\\)\\d{2,7}$ соответственно.
Составим программу, проверяющую пользовательский ввод на наличие регулярного выражения:
#include <QtGui> #include "mainwindow.h" MainWindow::MainWindow() { layout = new QVBoxLayout; card = new QLineEdit; tel = new QLineEdit; cardexample = new QLabel(tr("For example: ABCD-1234-1234")); telexample = new QLabel(tr("For example: +7(495)1231212")); cardresult = new QLabel(tr("Intermediate")); telresult = new QLabel(tr("Intermediate")); QRegExp rxcard("^[A-Z]{4}\\-[0-9]{4}\\-[0-9]{4}$"); QRegExp rxtel("^\\+\\d{1,2}\\(\\d{3,5}\\)\\d{2,7}$"); cardvalidator = new QRegExpValidator(rxcard, this); telvalidator = new QRegExpValidator(rxtel, this); card->setValidator(cardvalidator); tel->setValidator(telvalidator); layout->addWidget(cardexample); layout->addWidget(card); layout->addWidget(cardresult); layout->addWidget(telexample); layout->addWidget(tel); layout->addWidget(telresult); setLayout(layout); resize(sizeHint()); QObject::connect(card, SIGNAL(textChanged (const QString &)), this, SLOT(checkcard(const QString &))); QObject::connect(tel, SIGNAL(textChanged (const QString &)), this, SLOT(checktel(const QString &))); } void MainWindow::checkcard(const QString &text) { int pos = 0; QString numtext = text; if (cardvalidator->validate(numtext, pos) == 1) cardresult->setText(tr("Intermediate")); if (cardvalidator->validate(numtext, pos) == 2) cardresult->setText(tr("Acceptable")); } void MainWindow::checktel(const QString &text) { int pos = 0; QString numtext = text; if (telvalidator->validate(numtext, pos) == 1) telresult->setText(tr("Intermediate")); if (telvalidator->validate(numtext, pos) == 2) telresult->setText(tr("Acceptable")); }





