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

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


develop:qt:input

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:qt:input [2021/10/04 05:05]
admin
develop:qt:input [2021/10/04 07:26] (текущий)
admin
Строка 25: Строка 25:
  
  
-==== QRegExpValidator / QRegularExpressionValidator ====+==== QRegExpValidator / QRegularExpresionValidator ====
 ----- -----
 Используется регулярное выражение, для проверки строки.\\ Используется регулярное выражение, для проверки строки.\\
Строка 45: Строка 45:
 ----- -----
 Выполнить сопоставление можно методом **match()**, передав предметную строку, результатом является объект **QRegularExpressionMatch**.\\ Выполнить сопоставление можно методом **match()**, передав предметную строку, результатом является объект **QRegularExpressionMatch**.\\
-При успешной проверке можно выполнить извлечение найденных подстрок, метод **captured()** (0== вся подстрока).\\+При успешной проверке можно выполнить извлечение найденных **подстрок**, метод **captured()** (0== вся подстрока) (смещение для начала поиска так же работает (match())).\\
  
 <details> <details>
 <summary>:!: Пример: Поиск и извлечение подстроки </summary> <summary>:!: Пример: Поиск и извлечение подстроки </summary>
 <code cpp-qt> <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> </code>
 </details> </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.1633323924.txt.gz · Последнее изменение: 2021/10/04 05:05 — admin