Является базовым, абстрактным классом для проверки ввода.
Принято 3 состояния проверки: Acceptable/Invalid и Intermediate- промежуточное (редактируемое) состояние, т.е. в данном виде строка не корректна, но она может стать таковой.
Данный класс может использоваться как с виджетами типа QLineEdit, QSpinEdit или QComboBox, так же и самостоятельно, с функцией для проверки- validate().
Функция fixup() может помочь исправить некоторые пользовательские ошибки (по умолчанию ничего не делает).
Есть возможность локализовать ввод под языковой стандарт- setLocale().
Так же есть сигнал changet().
Обеспечивает верхнюю и нижнюю границы допустимых значений, а так же кол-во символов в десятичной части. fixup() отсутствует.
Присутствует указание нотации, setNotation(): стандартная и научная нотации.
Во многом аналогично предыдущему, проверка ввода чисел, задание диапазона и т.д.
Используется регулярное выражение, для проверки строки.
Совпадение проверяется со всей входной строкой, от начала до конца. Если введенная строка является префиксом целевой (не полной) то она считается промежуточной, с соответствующим статусом (Intermediate).
QRegularExpression является улучшением класса QRegExp, добавлен с пятой версии Qt, и рекомендуется к использованию, далее описание касается именно его.
Реализует Perl-совместимые регулярные выражения.
Выражение состоит из двух частей: строки шаблона и набора параметров шаблона.
Параметры шаблона задаются отдельно, в конструкторе либо функцией setPatternOptions(). Позволяют установить пар-ры типа учета регистра и т.д. (enum QRegularExpression :: PatternOption).
Тип соответствия- есть возможность задать тип соответствия (обычный либо частичный). Так же есть еще параметры соответствия (QRegularExpression :: MatchOption), но там хз, хня какая то.
Выполнить сопоставление можно методом match(), передав предметную строку, результатом является объект QRegularExpressionMatch.
При успешной проверке можно выполнить извлечение найденных подстрок, метод captured() (0== вся подстрока) (смещение для начала поиска так же работает (match())).
/*...*/ QRegularExpression vReg("\\d\\d \\w+"); QRegularExpressionMatch vMatch= vReg.match("abc123 def"); if(vMatch.hasMatch()) QString vFinded= vMatch.captured(0); /*...*/ // Еще пример QRegularExpression vReg("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$"); QRegularExpressionMatch vMatch= vReg.match("08/12/1985"); if(vMatch.hasMatch()) { QString vDay= vMatch.captured(1); // == 08 QString vMon= vMatch.captured(2); // == 12 QString vYear= vMatch.captured(3); // == 1985 } /*...*/ // Либо именованные части QRegularExpression vReg("^(?<day>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$"); QRegularExpressionMatch vMatch= vReg.match("08/12/1985"); if(vMatch.hasMatch()) { QString vDay= vMatch.captured("day"); // == 08 QString vMon= vMatch.captured("month"); // == 12 QString vYear= vMatch.captured("year"); // == 1985 }
Поиск всех вхождений выражения в строке. Метод globalMatch() возвращает QRegularExpressionMatchIterator- т.н. прямой итератор который можно использовать для перебора результатов.
Результат возвращается как объект QRegularExpressionMatch.
QRegularExpression vReg("(\\w+)"); QRegularExpressionMatchIterator i= vReg.globalMatch("the quick fox"); QStringList vLsWords; while(i.hasNext()) { QRegularExpressionMatch vMatch= i.next(); QString vWord= vMatch.captured(1); vLsWords << vWord; }
Совпадение части строки, алгоритм менее эффективный т.к. многие оптимизации не применяются.
Частичный поиск явно запрашивается, указав соответствующий тип в match()/globalmatch().
Для получения используется метод hasPartialMatch() т.к. hasMatch() вернет false, но запрос частичного совпадения все равно может найти полное совпадение, тогда hasMatch()== true а hasPartialMatch()== false. Объект никогда не сообщает о том и о другом соответствии.
Подстроки (captured()) так же не возвращаются, только полная.
/*...*/ QRegularExpression vReg("abc\\w+X|def"); QRegularExpressionMatch vMatch= vReg.match("abcdef", 0, QRegularExpression::PartialPreferCompleteMatch); vMatch.hasMatch(); // == true vMatch.hasPartialMatch(); // == false vMatch.captured(0); // == "def" т.к. это полное соответствие и оно в приоритете /*...*/
Инкрементальное/сегментное соответствие- в случае если проверочный текст подается порциями, тогда логика проверки учитывает возможное продолжение текста, что собсна влияет на результат.
Используется флаг QRegularExpression::PartialPreferFirstMatch.
Синтаксические ошибки шаблона можно проверить методом isValid(), до информацию errorString(), так же, смещение patternErrorOffset().