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

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


develop:qt:input

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:qt:input [2021/10/04 04:08]
admin
develop:qt:input [2021/10/04 07:26] (текущий)
admin
Строка 25: Строка 25:
  
  
-==== QRegExpValidator / QRegularExpressionValidator ====+==== QRegExpValidator / QRegularExpresionValidator ====
 ----- -----
 Используется регулярное выражение, для проверки строки.\\ Используется регулярное выражение, для проверки строки.\\
Строка 33: Строка 33:
 ===== QRegExp / QRegularExpression ===== ===== QRegExp / QRegularExpression =====
 ----- -----
-**QRegularExpression** является улучшением класса **QRegExp**, добавлен с пятой версии Qt, и рекомендуется к использованию, далее описание касается именно его.\\+**QRegularExpression** является улучшением класса **QRegExp**, добавлен с пятой версии Qt, и рекомендуется к использованию, далее **описание касается именно его**.\\ 
 + 
 +Реализует Perl-совместимые регулярные выражения.\\ 
 +Выражение состоит из двух частей: **строки шаблона** и **набора параметров шаблона**.\\ 
 + 
 +**Параметры шаблона** задаются отдельно, в конструкторе либо функцией **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.1633320516.txt.gz · Последнее изменение: 2021/10/04 04:08 — admin