Инструменты пользователя

Инструменты сайта


develop:qt:input

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:qt:input [2021/10/03 15:58]
admin
develop:qt:input [2021/10/04 07:26] (текущий)
admin
Строка 25: Строка 25:
  
  
-==== QRegExpValidator ====+==== QRegExpValidator / QRegularExpresionValidator ====
 ----- -----
 +Используется регулярное выражение, для проверки строки.\\
 +Совпадение проверяется со всей входной строкой, от начала до конца. Если введенная строка является префиксом целевой (не полной) то она считается промежуточной, с соответствующим статусом (**Intermediate**).\\
  
  
 +===== QRegExp / QRegularExpression =====
 +-----
 +**QRegularExpression** является улучшением класса **QRegExp**, добавлен с пятой версии Qt, и рекомендуется к использованию, далее **описание касается именно его**.\\
  
 +Реализует Perl-совместимые регулярные выражения.\\
 +Выражение состоит из двух частей: **строки шаблона** и **набора параметров шаблона**.\\
  
-===== QRegExp =====+**Параметры шаблона** задаются отдельно, в конструкторе либо функцией **setPatternOptions()**. Позволяют установить пар-ры типа учета регистра и т.д. (enum QRegularExpression :: PatternOption).\\ 
 + 
 +**Тип соответствия**- есть возможность задать тип соответствия (обычный либо частичный). Так же есть еще параметры соответствия (**QRegularExpression :: MatchOption**), но там хз, хня какая то.\\ 
 + 
 +==== Соответствие ====
 ----- -----
 +Выполнить сопоставление можно методом **match()**, передав предметную строку, результатом является объект **QRegularExpressionMatch**.\\
 +При успешной проверке можно выполнить извлечение найденных **подстрок**, метод **captured()** (0== вся подстрока) (смещение для начала поиска так же работает (match())).\\
 +
 +<details>
 +<summary>:!: Пример: Поиск и извлечение подстроки </summary>
 +<code cpp-qt>
 +/*...*/
 +    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
 +    }
 +</code>
 +</details>
 +
 +
 +==== Глобальное соответствие ====
 +-----
 +Поиск всех вхождений выражения в строке. Метод **globalMatch()** возвращает **QRegularExpressionMatchIterator**- т.н. прямой итератор который можно использовать для перебора результатов.\\
 +Результат возвращается как объект **QRegularExpressionMatch**.\\
 +
 +<details>
 +<summary>:!: Пример: Глобальный поиск и список результатов</summary>
 +<code cpp-qt>
 +    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;
 +    }
 +</code>
 +</details>
 +
 +
 +==== Частичное соответствие ====
 +-----
 +Совпадение части строки, алгоритм менее эффективный т.к. многие оптимизации не применяются.\\
 +Частичный поиск явно запрашивается, указав соответствующий тип в **match()**/**globalmatch()**.\\
 +
 +Для получения используется метод **hasPartialMatch()** т.к. **hasMatch()** вернет false, но запрос частичного совпадения все равно может найти полное совпадение, тогда **hasMatch()== true** а **hasPartialMatch()== false**. Объект никогда не сообщает о том и о другом соответствии.\\
 +
 +Подстроки (**captured()**) так же не возвращаются, только полная.\\
 +
 +<details>
 +<summary>:!: Пример: Предпочтение полного сопоставления частичному</summary>
 +<code cpp-qt>
 +/*...*/
 +    QRegularExpression vReg("abc\\w+X|def");
 +    QRegularExpressionMatch vMatch= vReg.match("abcdef", 0, QRegularExpression::PartialPreferCompleteMatch);
 +    vMatch.hasMatch(); // == true
 +    vMatch.hasPartialMatch(); // == false
 +    vMatch.captured(0); // == "def" т.к. это полное соответствие и оно в приоритете 
 +/*...*/
 +</code>
 +</details>
 +
 +**Инкрементальное/сегментное соответствие**- в случае если проверочный текст подается порциями, тогда логика проверки учитывает возможное продолжение текста, что собсна влияет на результат.\\
 +Используется флаг **QRegularExpression::PartialPreferFirstMatch**.\\
 +
 +
 +==== Синтаксические ошибки ====
 +-----
 +Синтаксические ошибки шаблона можно проверить методом **isValid()**, до информацию **errorString()**, так же, смещение **patternErrorOffset()**.\\
 +
  
  
develop/qt/input.1633276736.txt.gz · Последнее изменение: 2021/10/03 15:58 — admin