Проверка вводимых пользователем данных. Часть вторая. Строки

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"));
}
stringvalidator.png
page_revision: 20, last_edited: 1203363333|%e %b %Y, %H:%M %Z (%O ago)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License