Класс QRegExp
Класс QRegExp обеспечивает сопоставление шаблонов с использованием регулярных выражений. Подробнее...
| Заголовок: | #include <QRegExp> |
| CMake: | find_package(Qt6 COMPONENTS Core5Compat REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core5Compat) |
| qmake: | QT += core5compat |
Примечание: Все функции в этом классе являются взаимоисключающими.
Открытые типы
| enum | CaretMode { CaretAtZero, CaretAtOffset, CaretWontMatch} |
| enum | PatternSyntax { RegExp, RegExp2, Wildcard, WildcardUnix, FixedString, W3CXmlSchema11 } |
Открытые функции
| QRegExp(const QRegExp &rx) | |
| QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp) | |
| QRegExp() | |
| QRegExp & | operator=(QRegExp &&other) |
| QRegExp & | operator=(const QRegExp &rx) |
| ~QRegExp() | |
| QString | cap(int nth = 0) const |
| int | captureCount() const |
| QStringList | capturedTexts() const |
| Qt::CaseSensitivity | caseSensitivity() const |
| int | countIn(const QString &str) const |
| QString | errorString() const |
| bool | exactMatch(const QString &str) const |
| QStringList | filterList(const QStringList &stringList) const |
| int | indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const |
| int | indexIn(const QStringList &list, int from) const |
| bool | isEmpty() const |
| bool | isMinimal() const |
| bool | isValid() const |
| int | lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const |
| int | lastIndexIn(const QStringList &list, int from) const |
| int | matchedLength() const |
| QString | pattern() const |
| QRegExp::PatternSyntax | patternSyntax() const |
| int | pos(int nth = 0) const |
| QString | removeIn(const QString &str) const |
| QString | replaceIn(const QString &str, const QString &after) const |
| QStringList | replaceIn(const QStringList &stringList, const QString &after) const |
| void | setCaseSensitivity(Qt::CaseSensitivity cs) |
| void | setMinimal(bool minimal) |
| void | setPattern(const QString &pattern) |
| void | setPatternSyntax(QRegExp::PatternSyntax syntax) |
| QStringList | splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const |
| void | swap(QRegExp &other) |
| QVariant | operator QVariant() const |
| bool | operator!=(const QRegExp &rx) const |
| bool | operator==(const QRegExp &rx) const |
Статические открытые члены
| QString | escape(const QString &str) |
Связанные внешние члены
| size_t | qHash(const QRegExp &key, size_t seed = 0) |
| QDataStream & | operator<<(QDataStream &out, const QRegExp ®Exp) |
| QDataStream & | operator>>(QDataStream &in, QRegExp ®Exp) |
Подробное описание
Этот класс устарел в Qt 6. Пожалуйста, используйте QRegularExpression вместо него для всего нового кода. Для получения рекомендаций по переносу старого кода из QRegExp в QRegularExpression, см. {Перенос в QRegularExpression}
Регулярное выражение, или "regexp", представляет собой шаблон для сопоставления подстрок в тексте. Это полезно во многих контекстах, например:
| Валидация | Регулярное выражение может проверить, удовлетворяет ли подстрока некоторым критериям, например, является ли она целым числом или не содержит пробелов. |
| Поиск | Регулярное выражение обеспечивает более мощное сопоставление шаблонов, чем простое сопоставление подстрок, например, сопоставление одного из слов mail, letter или correspondence, но ни одного из слов email, mailman, mailer, letterbox и т.д. |
| Поиск и замена | Регулярное выражение может заменить все вхождения подстроки другой подстрокой, например, заменить все вхождения & на &, за исключением случаев, когда & уже сопровождается amp;. |
| Разбиение строки | Регулярное выражение может использоваться для определения того, где строка должна быть разделена, например, для разделения строк с разделителями-табуляторами. |
Представлено краткое введение в регулярные выражения, описание языка регулярных выражений Qt, некоторые примеры и сама документация функций. QRegExp моделируется по языку регулярных выражений Perl. Он полностью поддерживает Unicode. QRegExp также может использоваться в более простом, режиме шаблонов, который похож на функциональность, найденную в командных оболочках. Правила синтаксиса, используемые QRegExp, можно изменить с помощью setPatternSyntax(). В частности, синтаксис шаблона можно установить на QRegExp::FixedString, что означает, что шаблон для сопоставления интерпретируется как обычная строка, т. е. специальные символы (например, обратный слэш) не экранируются.
Хорошей книгой по регулярным выражениям является Mastering Regular Expressions (Третье издание) Джеффри Е. Ф. Фридла, ISBN 0-596-52812-4.
Примечание: В Qt 5 новый класс QRegularExpression предоставляет совместимую с Perl реализацию регулярных выражений и рекомендуется вместо QRegExp.
Введение
Регулярные выражения строятся из выражений, квантификаторов и утверждений. Самым простым выражением является символ, например x или 5. Выражение также может быть набором символов, заключенных в квадратные скобки. [ABCD] будет соответствовать A или B или C или D. Мы можем записать это же выражение как [A-D], а выражение для соответствия любой заглавной букве английского алфавита записывается как [A-Z].
Квантификатор указывает количество вхождений выражения, которое должно быть сопоставлено. x{1,1} означает, что нужно сопоставить ровно одно x. x{1,5} означает, что нужно сопоставить последовательность символов x, которая содержит по крайней мере одно x, но не более пяти.
Обратите внимание, что в общем случае регулярные выражения нельзя использовать для проверки сбалансированных скобок или тегов. Например, регулярное выражение можно записать для сопоставления открывающего html <b> и его закрывающего </b>, если <b> теги не вложены, но если <b> теги вложены, то это же регулярное выражение будет сопоставлять открывающий <b> тег с неправильным закрывающим </b>. Для фрагмента <b>bold <b>bolder</b></b>, первый <b> будет сопоставлен с первым </b>, что неверно. Однако можно написать регулярное выражение, которое будет правильно сопоставлять вложенные скобки или теги, но только если количество уровней вложенности фиксировано и известно. Если количество уровней вложенности не фиксировано и неизвестно, невозможно написать регулярное выражение, которое не даст сбоев.
Предположим, нам нужно регулярное выражение для соответствия целым числам в диапазоне от 0 до 99. Требуется по крайней мере одна цифра, поэтому мы начинаем с выражения [0-9]{1,1}, которое точно соответствует одной цифре. Это регулярное выражение соответствует целым числам в диапазоне от 0 до 9. Чтобы сопоставить целые числа до 99, увеличьте максимальное количество вхождений до 2, в результате чего регулярное выражение станет [0-9]{1,2}. Это регулярное выражение удовлетворяет исходному требованию сопоставления целых чисел от 0 до 99, но также будет сопоставлять целые числа, которые встречаются посреди строк. Если мы хотим, чтобы сопоставленное целое число было всей строкой, мы должны использовать утверждения якорей ^ (крышка) и $ (доллар). Когда ^ является первым символом в регулярном выражении, это означает, что регулярное выражение должно сопоставляться с начала строки. Когда $ является последним символом регулярного выражения, это означает, что регулярное выражение должно сопоставляться до конца строки. Регулярное выражение становится ^[0-9]{1,2}$. Обратите внимание, что утверждения, например ^ и $, не соответствуют символам, а позициям в строке.
Если вы встречали регулярные выражения, описанные где-то еще, они могли выглядеть иначе, чем показано здесь. Это потому, что некоторые наборы символов и некоторые квантификаторы настолько распространены, что им были присвоены специальные символы для их представления. [0-9] можно заменить символом \d. Квантификатор для сопоставления ровно одного вхождения {1,1} можно заменить самим выражением, т. е. x{1,1} то же самое, что и x. Таким образом, наш корректор от 0 до 99 можно записать как ^\d{1,2}$. Также его можно записать как ^\d\d{0,1}$, т. е. С начала строки сопоставить цифру, сразу за ней 0 или 1 цифру. На практике он записывался бы как ^\d\d?$. ? — это сокращение для квантификатора {0,1}, т. е. 0 или 1 вхождение. ? делает выражение необязательным. Регулярное выражение ^\d\d?$ означает С начала строки сопоставить одну цифру, сразу за ней 0 или 1 цифру, сразу за ней конец строки.
Чтобы написать регулярное выражение, которое соответствует одному из слов «mail», «letter» или «correspondence», но не соответствует словам, которые содержат эти слова, например, «email», «mailman», «mailer» и «letterbox», начните с регулярного выражения, которое соответствует «mail». В полном виде регулярное выражение имеет вид m{1,1}a{1,1}i{1,1}l{1,1}, но так как выражение для символа автоматически квантифицируется с помощью {1,1}, мы можем упростить регулярное выражение до mail, т. е. «m», за которым следует «a», за которым следует «i», за которым следует «l». Теперь мы можем использовать вертикальную черту |, что означает «или», чтобы включить другие два слова, поэтому наше регулярное выражение для сопоставления любого из трех слов становится mail|letter|correspondence. Сопоставить «mail» или «letter» или «correspondence». Хотя это регулярное выражение будет соответствовать одному из трех слов, которые мы хотим сопоставить, оно также будет соответствовать словам, которых мы не хотим сопоставлять, например, «email». Чтобы предотвратить сопоставление регулярным выражением нежелательных слов, мы должны сказать ему начинать и заканчивать сопоставление на границах слов. Сначала заключим наше регулярное выражение в скобки (mail|letter|correspondence). Скобки группируют выражения, и они идентифицируют часть регулярного выражения, которую мы хотим захватить. Заключение выражения в скобки позволяет использовать его как компонент в более сложных регулярных выражениях. Это также позволяет нам проверить, какое из трех слов фактически было сопоставлено. Чтобы принудительно сопоставить начало и конец на границах слов, заключим регулярное выражение в утверждения \b границы слов: \b(mail|letter|correspondence)\b. Теперь регулярное выражение означает: Сопоставить границу слова, за которым следует регулярное выражение в скобках, за которым следует граница слова. Утверждение \b соответствует позиции в регулярном выражении, а не символу. Граница слова — это любой несловообразующий символ, например пробел, перевод строки или начало или конец строки.
Если мы хотим заменить символы амперсанда на HTML-сущность &, регулярное выражение для соответствия — просто &. Но это регулярное выражение также будет сопоставлять амперсанды, которые уже были преобразованы в HTML-сущности. Мы хотим заменить только амперсанды, за которыми не следуют amp;. Для этого нам нужно отрицательное утверждение о просмотре вперед (?!__). Тогда регулярное выражение можно записать как &(?!amp;), т. е. Сопоставить амперсанд, за которым не следует amp;.
Если мы хотим подсчитать все вхождения «Eric» и «Eirik» в строке, два допустимых решения — \b(Eric|Eirik)\b и \bEi?ri[ck]\b. Утверждение границы слова '\b' необходимо, чтобы избежать сопоставления слов, которые содержат любое из этих имен, например «Ericsson». Обратите внимание, что второе регулярное выражение соответствует большему количеству написаний, чем нам нужно: «Eric», «Erik», «Eiric» и «Eirik».
Некоторые из рассмотренных выше примеров реализованы в разделе примеров кода.
Символы и сокращения для наборов символов
| Элемент | Значение |
|---|---|
| c | Символ представляет сам себя, если у него нет специального значения в регулярном выражении. Например, c соответствует символу c. |
| \c | Символ, за которым следует обратный слэш, соответствует самому символу, за исключением случаев, указанных ниже. Например, чтобы сопоставить литеаальную крышку в начале строки, запишите \^. |
| \a | Сопоставляется с ASCII-звонком (BEL, 0x07). |
| \f | Сопоставляется с ASCII-формулой подачи (FF, 0x0C). |
| \n | Сопоставляется с ASCII-переводом строки (LF, 0x0A, перевод строки Unix). |
| \r | Сопоставляется с ASCII-возвратом каретки (CR, 0x0D). |
| \t | Сопоставляется с ASCII-горизонтальной табуляцией (HT, 0x09). |
| \v | Сопоставляется с ASCII-вертикальной табуляцией (VT, 0x0B). |
| \xhhhh | Сопоставляется с символом Unicode, соответствующим шестнадцатеричному числу hhhh (между 0x0000 и 0xFFFF). |
| \0ooo (т. е., \ноль ooo) | сопоставляется с ASCII/Latin1 символом для восьмеричного числа ooo (между 0 и 0377). |
| . (точка) | Сопоставляется с любым символом (включая перевод строки). |
| \d | Сопоставляется с цифрой (QChar::isDigit()). |
| \D | Сопоставляется с нецифрой. |
| \s | Сопоставляется с символом пробела (QChar::isSpace()). |
| \S | Сопоставляется с несимволом пробела. |
| \w | Сопоставляется с символом слова (QChar::isLetterOrNumber(), QChar::isMark(), или '_'). |
| \W | Сопоставляется с несловообразующим символом. |
| \n | n-я ссылка обратной ссылки, например \1, \2 и т. д. |
Примечание: Компилятор C++ преобразует обратные слэши в строках. Чтобы включить \ в регулярное выражение, введите его дважды, т. е. \\. Чтобы сопоставить сам символ обратного слэша, введите его четыре раза, т. е. \\\\.
Наборы символов
Квадратные скобки означают сопоставление любого символа, содержащегося в квадратных скобках. Описанные выше сокращения для наборов символов могут появляться в наборе символов в квадратных скобках. За исключением сокращений наборов символов и двух следующих исключений, символы не имеют специальных значений в квадратных скобках.
| ^ | Крышка инвертирует набор символов, если она встречается как первый символ (т. е. сразу после открывающей квадратной скобки). [abc] сопоставляет 'a' или 'b' или 'c', но [^abc] сопоставляет все, кроме 'a' или 'b' или 'c'. |
| - | Дефис указывает диапазон символов. [W-Z] сопоставляет 'W' или 'X' или 'Y' или 'Z'. |
Использование предопределенных сокращений для наборов символов более переносимо, чем использование диапазонов символов между платформами и языками. Например, [0-9] соответствует цифре в западных алфавитах, но \d соответствует цифре в любом алфавите.
Примечание: в другой документации по регулярным выражениям наборы символов часто называют «классами символов».
Квантификаторы
По умолчанию, выражение автоматически квантифицируется как {1,1}, т.е. оно должно встречаться ровно один раз. В следующем списке E обозначает выражение. Выражение — это символ, или сокращение для набора символов, или набор символов в квадратных скобках, или выражение в скобках.
| E? | Сопоставляет ноль или одно вхождение E. Этот квантификатор означает, что предыдущее выражение является необязательным, поскольку оно будет соответствовать, найдено выражение или нет. E? то же самое, что и E{0,1}. Например, dents? соответствует 'dent' или 'dents'. |
| E+ | Сопоставляет одно или более вхождений E. E+ то же самое, что и E{1,}. Например, 0+ соответствует '0', '00', '000' и т.д. |
| E* | Сопоставляет ноль или более вхождений E. Оно эквивалентно E{0,}. Квантификатор * часто используется ошибочно вместо +. Например, если \s*$ используется в выражении для сопоставления строк, заканчивающихся пробелом, он будет соответствовать каждой строке, потому что \s*$ означает Сопоставить ноль или более пробелов, за которыми следует конец строки. Правильный регулярный выражение для сопоставления строк, содержащих хотя бы один конечный пробел, — это \s+$. |
| E{n} | Сопоставляет ровно n вхождений E. E{n} эквивалентно повторению E n раз. Например, x{5} то же самое, что и xxxxx. Оно также эквивалентно E{n,n}, например x{5,5}. |
| E{n,} | Сопоставляет как минимум n вхождений E. |
| E{,m} | Сопоставляет не более m вхождений E. E{,m} то же самое, что и E{0,m}. |
| E{n,m} | Сопоставляет от n до m вхождений E. |
Чтобы применить квантификатор к большему, чем просто предыдущий символ, используйте скобки для группировки символов в выражении. Например, tag+ соответствует 't', за которым следует 'a', за которым следует как минимум один 'g', тогда как (tag)+ соответствует как минимум одному вхождению 'tag'.
Примечание: Квантификаторы по умолчанию являются "жадными". Они всегда сопоставляют как можно больше текста. Например, 0+ сопоставляет первую найденную цифру ноль и все последующие нули после первого нуля. При применении к '20005', он сопоставляет '20005'. Квантификаторы могут быть сделаны нежадными, см. setMinimal().
Извлечение текста
Скобки позволяют сгруппировать элементы, чтобы мы могли их квантифицировать и извлекать. Например, если у нас есть выражение mail|letter|correspondence, которое сопоставляет строку, мы знаем, что сопоставлен один из слов, но не какой именно. Использование скобок позволяет "извлечь" всё, что сопоставлено внутри них. Например, если мы использовали (mail|letter|correspondence) и сопоставили это регулярное выражение со строкой "I sent you some email", мы можем использовать функции cap() или capturedTexts() для извлечения сопоставленных символов, в этом случае 'mail'.
Мы можем использовать извлечённый текст внутри самого регулярного выражения. Для ссылки на извлечённый текст мы используем обратные ссылки, индексированные с 1, так же, как и для cap(). Например, мы можем искать дубликаты слов в строке, используя \b(\w+)\W+\1\b, что означает сопоставить границу слова, за которым следует один или несколько символов слова, за которыми следуют один или несколько несимволов слова, за которыми следует тот же текст, что и в первой скобке, за которым следует граница слова.
Если мы хотим использовать скобки только для группировки, а не для извлечения, мы можем использовать синтаксис для невыделения, например, (?:green|blue). Невыделяющие скобки начинаются с '(?:' и заканчиваются ')'. В этом примере мы сопоставляем либо 'green', либо 'blue', но не извлекаем совпадение, поэтому мы только знаем, совпало оно или нет, но не какой цвет мы фактически нашли. Использование невыделяющих скобок более эффективно, чем использование выделяющих скобок, так как двигателю регулярных выражений требуется меньше учета.
Как выделяющие, так и невыделяющие скобки могут быть вложены.
По историческим причинам, квантификаторы (например, *), которые применяются к выделяющим скобкам, являются более "жадными", чем другие квантификаторы. Например, a*(a*) будет сопоставлять "aaa" с cap(1) == "aaa". Это поведение отличается от того, что делают другие движки регулярных выражений (в частности, Perl). Чтобы получить более интуитивное поведение извлечения, укажите QRegExp::RegExp2 конструктору QRegExp или вызовите setPatternSyntax(QRegExp::RegExp2).
Когда количество совпадений заранее неизвестно, распространённым приёмом является использование cap() в цикле. Например:
QRegExp rx("(\\d+)");
QString str = "Offsets: 12 14 99 231 7";
QStringList list;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
list << rx.cap(1);
pos += rx.matchedLength();
}
// list: ["12", "14", "99", "231", "7"] Утверждения
Утверждения делают какое-то утверждение о тексте в точке, где они встречаются в регулярном выражении, но они не сопоставляют никаких символов. В следующем списке E обозначает любое выражение.
| ^ | Знак возведения в степень обозначает начало строки. Если вы хотите сопоставить буквенный символ ^ необходимо его экранировать, записав \\^. Например, ^#include будет сопоставлять только строки, которые начинаются с символов '#include'. (Когда знак возведения в степень является первым символом в наборе символов, он имеет специальное значение, см. Наборы символов.) |
| $ | Знак доллара обозначает конец строки. Например, \d\s*$ будет сопоставлять строки, заканчивающиеся цифрой, необязательно за которой следует пробел. Если вы хотите сопоставить буквенный символ $ необходимо его экранировать, записав \\$. |
| \b | Граница слова. Например, регулярное выражение \bOK\b означает сопоставить сразу после границы слова (например, начало строки или пробел) букву 'O', затем букву 'K', непосредственно перед другой границей слова (например, конец строки или пробел). Обратите внимание, что утверждение фактически не сопоставляет никаких пробелов, поэтому, если мы напишем (\bOK\b) и у нас есть совпадение, оно будет содержать только 'OK', даже если строка — "It's OK now". |
| \B | Не-граница слова. Это утверждение истинно там, где утверждение \b ложно. Например, если мы искали \Bon\B в "Left on", совпадение не найдётся (пробел и конец строки не являются не-границами слова), но оно будет совпадать в "tonne". |
| (?=E) | Позитивный просмотр вперёд. Это утверждение истинно, если выражение соответствует в этой точке регулярного выражения. Например, const(?=\s+char) сопоставляет 'const' всякий раз, когда за ним следует 'char', как в 'static const char *'. (Сравните с const\s+char, которое соответствует 'static const char *'.) |
| (?!E) | Негативный просмотр вперёд. Это утверждение истинно, если выражение не соответствует в этой точке регулярного выражения. Например, const(?!\s+char) сопоставляет 'const' за исключением тех случаев, когда за ним следует 'char'. |
Сопоставление с подстановкой
Большинство командных оболочек, таких как bash или cmd.exe, поддерживают "сопоставление файлов с подстановкой", возможность идентификации группы файлов с помощью подстановочных символов. Функция setPatternSyntax() используется для переключения между режимом регулярных выражений и режимом подстановочных символов. Сопоставление с подстановкой намного проще, чем полные регулярные выражения, и имеет только четыре функции:
| c | Любой символ представляет собой самого себя, за исключением упомянутых ниже. Таким образом, c соответствует символу c. |
| ? | Сопоставляет любой одиночный символ. Это то же самое, что и . в полных регулярных выражениях. |
| * | Сопоставляет ноль или более любых символов. Это то же самое, что и .* в полных регулярных выражениях. |
| [...] | Наборы символов могут быть представлены в квадратных скобках, аналогично полным регулярным выражениям. Внутри класса символов, как и снаружи, обратный слэш не имеет специального значения. |
В режиме подстановочных символов подстановочные символы не могут быть экранированы. В режиме WildcardUnix символ '\' экранирует подстановочный символ.
Например, если мы находимся в режиме подстановки и имеем строки, содержащие имена файлов, мы могли бы идентифицировать файлы HTML с помощью *.html. Это будет сопоставлять ноль или более символов, за которыми следует точка, за которой следуют 'h', 't', 'm' и 'l'.
Для проверки строки на соответствие выражению с подстановкой используйте exactMatch(). Например:
QRegExp rx("*.txt");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("README.txt"); // returns true
rx.exactMatch("welcome.txt.bak"); // returns false Примечания для пользователей Perl
Большинство сокращений для классов символов, поддерживаемых Perl, поддерживаются QRegExp, см. символы и сокращения для наборов символов.
В QRegExp, за исключением внутри наборов символов, ^ всегда обозначает начало строки, поэтому знаки возведения в степень всегда должны быть экранированы, если не используются для этой цели. В Perl смысл знака возведения в степень автоматически изменяется в зависимости от того, где он находится, поэтому экранирование его редко необходимо. То же самое относится к $, который в QRegExp всегда обозначает конец строки.
Квантификаторы QRegExp такие же, как жадные квантификаторы Perl (но см. примечание выше). Нежадное сопоставление не может быть применено к отдельным квантификаторам, но может быть применено ко всем квантификаторам в шаблоне. Например, чтобы сопоставить регулярное выражение Perl ro+?m требуется:
QRegExp rx("ro+m");
rx.setMinimal(true); Эквивалент параметра Perl /i — setCaseSensitivity(Qt::CaseInsensitive).
Параметр Perl /g можно эмулировать с помощью цикла.
В QRegExp . сопоставляет любой символ, поэтому все регулярные выражения QRegExp имеют эквивалент параметра Perl /s. В QRegExp нет эквивалента параметра Perl /m, но это можно смоделировать различными способами, например, разделив входные данные на строки или используя цикл с регулярным выражением, которое ищет символы новой строки.
Поскольку QRegExp ориентирован на строки, утверждений \A, \Z или \z нет. Утверждение \G не поддерживается, но его можно смоделировать в цикле.
Perl's $& — cap(0) или capturedTexts()[0]. Нет эквивалентов QRegExp для $`, $' или $+. Переменные захвата Perl, $1, $2, ... соответствуют cap(1) или capturedTexts()[1], cap(2) или capturedTexts()[2] и т.д.
Для подстановки шаблона используйте QString::replace().
Расширенный синтаксис /x Perl не поддерживается, также не поддерживаются директивы, например (?i), или комментарии к регулярному выражению, например (?#comment). С другой стороны, правила C++ для строковых литералов можно использовать для достижения того же.
QRegExp mark("\\b" // word boundary
"[Mm]ark" // the word we want to match
); Поддерживаются утверждения о поиске вперёд с нулевой шириной как положительные, так и отрицательные (?=pattern) и (?!pattern) с таким же синтаксисом, как в Perl. Утверждения о поиске назад Perl, «независимые» подвыражения и условные выражения не поддерживаются.
Также поддерживаются незахватывающие скобки с таким же синтаксисом (?:pattern).
См. QString::split() и QStringList::join() для эквивалентов функций Perl split и join.
Примечание: так как C++ преобразует \'s, их необходимо писать дважды в коде, например, \b нужно написать \\b.
Примеры кода
QRegExp rx("^\\d\\d?$"); // match integers 0 to 99
rx.indexIn("123"); // returns -1 (no match)
rx.indexIn("-6"); // returns -1 (no match)
rx.indexIn("6"); // returns 0 (matched at position 0) Третья строка соответствует '6'. Это простая валидационная регулярка для целых чисел в диапазоне от 0 до 99.
QRegExp rx("^\\S+$"); // match strings without whitespace
rx.indexIn("Hello world"); // returns -1 (no match)
rx.indexIn("This_is-OK"); // returns 0 (matched at position 0) Вторая строка соответствует 'This_is-OK'. Мы использовали сокращение символьного множества '\S' (непробельный символ) и якоря для соответствия строкам, не содержащим пробелов.
В следующем примере мы ищем строки, содержащие 'mail' или 'letter' или 'correspondence', но ищем только целые слова, т.е. не 'email'
QRegExp rx("\\b(mail|letter|correspondence)\\b");
rx.indexIn("I sent you an email"); // returns -1 (no match)
rx.indexIn("Please write the letter"); // returns 17 Вторая строка соответствует "Please write the letter". Слово 'letter' также захватывается (из-за скобок). Мы можем увидеть, какой текст мы захватили так:
QString captured = rx.cap(1); // captured == "letter"
Это захватит текст из первой пары захватывающих скобок (считая захватывающие левые скобки слева направо). Скобки нумеруются с 1, так как cap(0) — это совпавший регулярный выражение в целом (эквивалентно '&' в большинстве движков регулярных выражений).
QRegExp rx("&(?!amp;)"); // match ampersands but not &
QString line1 = "This & that";
line1.replace(rx, "&");
// line1 == "This & that"
QString line2 = "His & hers & theirs";
line2.replace(rx, "&");
// line2 == "His & hers & theirs" Здесь мы передали QRegExp в функцию replace() класса QString для замены совпавшего текста новым текстом.
QString str = "One Eric another Eirik, and an Ericsson. "
"How many Eiriks, Eric?";
QRegExp rx("\\b(Eric|Eirik)\\b"); // match Eric or Eirik
int pos = 0; // where we are in the string
int count = 0; // how many Eric and Eirik's we've counted
while (pos >= 0) {
pos = rx.indexIn(str, pos);
if (pos >= 0) {
++pos; // move along in str
++count; // count our Eric or Eirik
}
} Мы использовали функцию indexIn() для многократного поиска регулярного выражения в строке. Обратите внимание, что вместо перемещения вперёд на один символ за раз pos++ мы могли бы написать pos += rx.matchedLength() чтобы пропустить уже совпавшую строку. Количество совпадений будет равно 3, соответствия 'One Eric another Eirik, and an Ericsson. How many Eiriks, Eric?'; он не соответствует 'Ericsson' или 'Eiriks', потому что они не ограничены границами слов.
Одно из распространённых применений регулярных выражений — разделение строк данных, разделяемых разделителями, на составные поля.
str = "The Qt Company Ltd\tqt.io\tFinland";
QString company, web, country;
rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$");
if (rx.indexIn(str) != -1) {
company = rx.cap(1);
web = rx.cap(2);
country = rx.cap(3);
} В этом примере строки ввода имеют формат имя компании, веб-адрес и страна. К сожалению, регулярное выражение довольно длинное и не очень универсальное — код сломается, если мы добавим ещё больше полей. Более простое и лучшее решение — найти разделитель '\t' в данном случае и взять окружающий текст. Функция QString::split() может принимать в качестве аргумента разделительную строку или регулярное выражение и разделять строку соответствующим образом.
QStringList field = str.split("\t"); Здесь field[0] — это компания, field[1] — веб-адрес и так далее.
Для имитации работы оболочки можно использовать режим подстановок.
QRegExp rx("*.html");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("index.html"); // returns true
rx.exactMatch("default.htm"); // returns false
rx.exactMatch("readme.txt"); // returns false Сопоставление по шаблону удобно благодаря своей простоте, но любое регулярное выражение по шаблону можно определить с помощью полных регулярных выражений, например, .*\.html$. Обратите внимание, что мы не можем сопоставить файлы .html и .htm с шаблоном, если не используем *.htm*, что также будет соответствовать 'test.html.bak'. Полное регулярное выражение даёт нам необходимую точность, .*\.html?$.
QRegExp может выполнять поиск без учёта регистра с помощью setCaseSensitivity(), и может использовать нежадный поиск, см. setMinimal(). По умолчанию QRegExp использует полные регулярные выражения, но это можно изменить с помощью setPatternSyntax(). Поиск можно проводить вперёд с помощью indexIn() или назад с помощью lastIndexIn(). Захваченный текст можно получить с помощью capturedTexts(), которая возвращает список строк всех захваченных строк, или с помощью cap(), которая возвращает захваченную строку для данного индекса. Функция pos() принимает индекс совпадения и возвращает позицию в строке, где было произведено сопоставление (или -1, если совпадений не было).
Портирование в QRegularExpression
Класс QRegularExpression, представленный в Qt 5, является значительным улучшением QRegExp с точки зрения предлагаемых API, поддерживаемого синтаксиса шаблонов и скорости выполнения. Основное отличие заключается в том, что QRegularExpression просто хранит регулярное выражение и не изменяется при запросе совпадения. Вместо этого возвращается объект QRegularExpressionMatch для проверки результата совпадения и извлечения захваченной подстроки. То же самое относится к глобальному поиску и QRegularExpressionMatchIterator.
Другие отличия приведены ниже.
Разный синтаксис шаблонов
Портирование регулярного выражения из QRegExp в QRegularExpression может потребовать изменений в самом шаблоне.
В определённых случаях QRegExp была слишком снисходительной и принимала шаблоны, которые просто недействительны при использовании QRegularExpression. Их довольно легко обнаружить, так как объекты QRegularExpression, созданные с этими шаблонами, недействительны (см. QRegularExpression::isValid()).
В других случаях шаблон, перенесённый из QRegExp в QRegularExpression, может безмолвно изменить семантику. Поэтому необходимо пересмотреть используемые шаблоны. Наиболее заметные случаи скрытой несовместимости:
- Для использования шестнадцатеричного escape-последовательности, например,
\xHHHH, с более чем 2 цифрами, нужны фигурные скобки. Шаблон, например,\x2022, необходимо перенести в\x{2022}, иначе он будет соответствовать пробелу (0x20) и строке"22". В общем случае рекомендуется всегда использовать фигурные скобки с escape-последовательностью\x, независимо от количества указанных цифр. - Квантификация от 0 до n, например,
{,n}, должна быть перенесена в{0,n}, чтобы сохранить семантику. В противном случае шаблон, например,\d{,3}, на самом деле будет соответствовать цифре, за которой идёт строка"{,3}". - QRegExp по умолчанию выполняет сопоставление, учитывающее Unicode, в то время как QRegularExpression требует отдельного параметра; см. подробности ниже.
- c{.} в QRegExp по умолчанию соответствует всем символам, включая символ новой строки. QRegularExpression исключает символ новой строки по умолчанию. Чтобы включить символ новой строки, установите параметр шаблона QRegularExpression::DotMatchesEverythingOption.
Портирование из QRegExp::exactMatch()
QRegExp::exactMatch() в Qt 4 выполняла две задачи: точное соответствие регулярного выражения строке-предмету и частичное соответствие.
Портирование из точного соответствия QRegExp
Точное соответствие показывает, соответствует ли регулярное выражение всей строке-предмету. Например, классы возвращают по строке-предмету "abc123":
| QRegExp::exactMatch() | QRegularExpressionMatch::hasMatch() | |
|---|---|---|
"\\d+" |
false | true |
"[a-z]+\\d+" |
true | true |
Точное соответствие не отражается в QRegularExpression. Если вы хотите быть уверенными, что строка-предмет точно соответствует регулярному выражению, вы можете обернуть шаблон функцией QRegularExpression::anchoredPattern().
QString p("a .*|pattern");
// re matches exactly the pattern string p
QRegularExpression re(QRegularExpression::anchoredPattern(p)); Портирование из частичного соответствия QRegExp
При использовании QRegExp::exactMatch(), если точное соответствие не было найдено, можно было узнать, сколько символов строки-предмета было сопоставлено регулярным выражением, вызвав QRegExp::matchedLength(). Если возвращаемая длина равнялась длине строки-предмета, можно было сделать вывод о том, что найдено частичное соответствие.
QRegularExpression поддерживает частичное соответствие явно с помощью соответствующего типа совпадения.
Глобальное сопоставление
Из-за ограничений API QRegExp было невозможно правильно реализовать глобальное сопоставление (то есть, как в Perl). В частности, шаблоны, которые могут соответствовать 0 символам (например, "a*"), представляют проблему.
QRegularExpression::globalMatch() правильно реализует глобальное сопоставление Perl, и возвращаемый итератор можно использовать для проверки каждого результата.
Поддержка свойств Unicode
При использовании QRegExp, такие символьные классы, как \w, \d, и т.д., соответствуют символам с соответствующим свойством Unicode: например, \d соответствует любому символу со свойством Unicode Nd (десятичная цифра).
Эти символьные классы по умолчанию соответствуют только символам ASCII при использовании QRegularExpression: например, \d соответствует точно символу в 0-9 диапазоне ASCII. Можно изменить это поведение, используя параметр шаблона UseUnicodePropertiesOption.
Сопоставление по шаблону
В QRegularExpression нет прямого способа выполнения сопоставления по шаблону. Однако предоставляется метод wildcardToRegularExpression для перевода шаблонов glob в совместимое с Perl регулярное выражение, которое можно использовать для этой цели.
Другие синтаксисы шаблонов
QRegularExpression поддерживает только совместимые с Perl регулярные выражения.
Минимальное сопоставление
QRegExp::setMinimal() реализовывало минимальное сопоставление, просто изменив жадность квантификаторов (QRegExp не поддерживала ленивые квантификаторы, например, *?, +?, и т.д.). QRegularExpression вместо этого поддерживает жадные, ленивые и принудительные квантификаторы. Параметр шаблона InvertedGreedinessOption может быть полезен для имитации эффектов QRegExp::setMinimal(): если он включён, то он инвертирует жадность квантификаторов (жадные становятся ленивыми и наоборот).
Режимы «^»
Параметр совпадения AnchorAtOffsetMatchOption может использоваться для имитации поведения QRegExp::CaretAtOffset. Эквивалентов других режимов QRegExp::CaretMode нет.
См. также QString, QStringList и QSortFilterProxyModel.
Документация по типу элементов
перечисление QRegExp::CaretMode
Перечисление CaretMode определяет различные значения символа каретки (^) в регулярном выражении. Возможные значения:
| Постоянная | Значение | Описание |
|---|---|---|
QRegExp::CaretAtZero |
0 |
Символ каретки соответствует индексу 0 в искомой строке. |
QRegExp::CaretAtOffset |
1 |
Символ каретки соответствует смещению начала поиска. |
QRegExp::CaretWontMatch |
2 |
Символ каретки никогда не совпадает. |
перечисление QRegExp::PatternSyntax
Синтаксис, используемый для интерпретации значения шаблона.
| Постоянная | Значение | Описание |
|---|---|---|
QRegExp::RegExp |
0 |
Богатый синтаксис сопоставления шаблонов, похожий на Perl. Это значение по умолчанию. |
QRegExp::RegExp2 |
3 |
Как RegExp, но с жадными квантификаторами. (Введено в Qt 4.2.) |
QRegExp::Wildcard |
1 |
Предоставляет простой синтаксис сопоставления шаблонов, похожий на используемый оболочками (интерпретаторами команд) для «сопоставления с образцом файлов». См. сопоставление с образцом QRegExp. |
QRegExp::WildcardUnix |
4 |
Аналогично Wildcard, но с поведением оболочки Unix. Символы подстановки можно экранировать символом «\». |
QRegExp::FixedString |
2 |
Шаблон — это строка с фиксированным значением. Это эквивалентно использованию шаблона RegExp для строки, в которой все метасимволы экранированы с помощью escape(). |
QRegExp::W3CXmlSchema11 |
5 |
Шаблон — это регулярное выражение, определенное спецификацией W3C XML Schema 1.1. |
См. также setPatternSyntax().
Документация по функциям членов
QRegExp::QRegExp(const QRegExp &rx)
Создаёт регулярное выражение как копию rx.
См. также operator=().
QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp)
Создаёт объект регулярного выражения для заданной строки pattern. Шаблон должен быть задан с использованием символов подстановки, если syntax равен Wildcard; по умолчанию используется RegExp. Шаблон чувствителен к регистру, если cs не равен Qt::CaseInsensitive. Сопоставление жадное (максимальное), но его можно изменить, вызвав setMinimal().
См. также setPattern(), setCaseSensitivity() и setPatternSyntax().
QRegExp::QRegExp()
Создаёт пустое регулярное выражение.
См. также isValid() и errorString().
[since 5.2] QRegExp &QRegExp::operator=(QRegExp &&other)
Перемещает присвоение other этому экземпляру QRegExp.
Эта функция была введена в Qt 5.2.
QRegExp &QRegExp::operator=(const QRegExp &rx)
Копирует регулярное выражение rx и возвращает ссылку на копию. Также копируются чувствительность к регистру, использование символов подстановки и минимальное сопоставление.
QRegExp::~QRegExp()
Удаляет регулярное выражение и очищает внутренние данные.
QString QRegExp::cap(int nth = 0) const
Возвращает текст, захваченный nth подвыражением. Весь совпавший фрагмент имеет индекс 0, а подвыражения в скобках имеют индексы, начиная с 1 (исключая незахватывающие скобки).
QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos = rxlen.indexIn("Length: 189cm");
if (pos > -1) {
QString value = rxlen.cap(1); // "189"
QString unit = rxlen.cap(2); // "cm"
// ...
} Порядок элементов, сопоставленных функцией cap(), следующий. Первый элемент cap(0) — это вся сопоставленная строка. Каждый последующий элемент соответствует следующей открывающей захватывающей скобке. Таким образом, cap(1) — это текст первой захватывающей скобки, cap(2) — текст второй и так далее.
См. также capturedTexts() и pos().
int QRegExp::captureCount() const
Возвращает количество захватов, содержащихся в регулярном выражении.
QStringList QRegExp::capturedTexts() const
Возвращает список захваченных строк.
Первая строка в списке — это вся сопоставленная строка. Каждый последующий элемент списка содержит строку, которая сопоставилась с подвыражением регулярного выражения.
Например:
QRegExp rx("(\\d+)(\\s*)(cm|inch(es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", " ", "inches", "es") В приведенном выше примере также захватываются элементы, которые могут быть присутствовать, но нас не интересуют. Эту проблему можно решить, используя незахватывающие скобки:
QRegExp rx("(\\d+)(?:\\s*)(cm|inch(?:es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", "inches") Обратите внимание, что если вы хотите перебирать список, вам следует перебирать копию, например:
QStringList list = rx.capturedTexts();
QStringList::iterator it = list.begin();
while (it != list.end()) {
myProcessing(*it);
++it;
} Некоторые регулярные выражения могут сопоставляться неопределенное количество раз. Например, если входная строка — «Смещения: 12 14 99 231 7», а регулярное выражение — (\d+)+, мы надеемся получить список всех сопоставленных чисел. Однако после вызова rx.indexIn(str), capturedTexts() вернет список («12», «12»), т. е. весь совпавший фрагмент — «12», а первое подвыражение сопоставилось с «12». Правильный подход — использовать cap() в цикле.
Порядок элементов в списке строк следующий. Первый элемент — это вся сопоставленная строка. Каждый последующий элемент соответствует следующей открывающей захватывающей скобке. Таким образом, capturedTexts()[1] — это текст первой захватывающей скобки, capturedTexts()[2] — текст второй и так далее (соответствует $1, $2 и т. д. в некоторых других языках регулярных выражений).
Qt::CaseSensitivity QRegExp::caseSensitivity() const
Возвращает Qt::CaseSensitive, если регулярное выражение сопоставляется с учетом регистра; в противном случае возвращает Qt::CaseInsensitive.
См. также setCaseSensitivity(), patternSyntax(), pattern() и isMinimal().
int QRegExp::countIn(const QString &str) const
Возвращает количество совпадений этого регулярного выражения в str.
См. также indexIn(), lastIndexIn() и replaceIn().
QString QRegExp::errorString() const
Возвращает строку текста, объясняющую, почему шаблон регулярного выражения недействителен, в противном случае возвращает «ошибка не произошла».
См. также isValid().
[static] QString QRegExp::escape(const QString &str)
Возвращает строку str с каждым специальным символом регулярного выражения экранированным обратной косой чертой. Специальные символы: $, (,), *, +, ., ?, [, ], ^, {, | и }.
Пример:
s1 = QRegExp::escape("bingo"); // s1 == "bingo"
s2 = QRegExp::escape("f(x)"); // s2 == "f\\(x\\)" Эта функция полезна для динамического построения шаблонов регулярных выражений:
QRegExp rx("(" + QRegExp::escape(name) +
"|" + QRegExp::escape(alias) + ")"); См. также setPatternSyntax().
bool QRegExp::exactMatch(const QString &str) const
Возвращает true, если str точно совпадает с этим регулярным выражением; в противном случае возвращает false. Вы можете определить, сколько символов строки было сопоставлено, вызвав matchedLength().
Для данной строки регулярного выражения R, exactMatch("R") эквивалентно indexIn("^R$") так как exactMatch() фактически включает регулярное выражение в якоря начала и конца строки, за исключением того, что это устанавливает matchedLength() по-другому.
Например, если регулярное выражение — blue, то exactMatch() возвращает true только для ввода blue. Для вводов bluebell, blutak и lightblue, exactMatch() возвращает false и matchedLength() будет возвращать 4, 3 и 0 соответственно.
Хотя const, эта функция устанавливает matchedLength(), capturedTexts() и pos().
См. также indexIn() и lastIndexIn().
END_OF_DOCUMENT_MARKERQStringList QRegExp::filterList(const QStringList &stringList) const
Возвращает список всех строк, которые соответствуют этому регулярному выражению в stringList.
int QRegExp::indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const
Попытка найти совпадение в str с позиции offset (по умолчанию 0). Если offset равно -1, поиск начинается с последнего символа; если -2, со второго по последнему и так далее.
Возвращает позицию первого совпадения или -1, если совпадения не было.
Параметр caretMode можно использовать для указания, должно ли ^ соответствовать индексу 0 или offset.
Возможно, вам лучше использовать QString::indexOf(), QString::contains() или даже QStringList::filter(). Для замены совпадений используйте QString::replace().
Пример:
QString str = "offsets: 1.23 .50 71.00 6.00";
QRegExp rx("\\d*\\.\\d+"); // primitive floating point matching
int count = 0;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
++count;
pos += rx.matchedLength();
}
// pos will be 9, 14, 18 and finally 24; count will end up as 4 Несмотря на то, что функция является константной, она устанавливает matchedLength(), capturedTexts() и pos().
Если регулярное выражение является выражением с подстановкой (см. setPatternSyntax()), и необходимо проверить строку на соответствие всему выражению с подстановкой, используйте exactMatch() вместо этой функции.
См. также lastIndexIn() и exactMatch().
int QRegExp::indexIn(const QStringList &list, int from) const
Возвращает индекс первого точного совпадения этого регулярного выражения в list, выполняя поиск вперед с индекса from. Возвращает -1, если ни один элемент не совпал.
См. также lastIndexIn() и exactMatch().
bool QRegExp::isEmpty() const
Возвращает true, если строка шаблона пуста; в противном случае возвращает false.
Если вы вызываете exactMatch() с пустым шаблоном на пустой строке, она вернет true; в противном случае она вернёт false, так как она работает со всей строкой. Если вы вызываете indexIn() с пустым шаблоном на любой строке, она вернёт начальный смещение (0 по умолчанию), потому что пустой шаблон соответствует 'пустоте' в начале строки. В этом случае длина возвращаемого совпадения, возвращаемого matchedLength(), будет равна 0.
См. QString::isEmpty().
bool QRegExp::isMinimal() const
Возвращает true если включен минимальный (не жадный) поиск; в противном случае возвращает false.
См. также caseSensitivity() и setMinimal().
bool QRegExp::isValid() const
Возвращает true если регулярное выражение является допустимым; в противном случае возвращает false. Недопустимое регулярное выражение никогда не совпадает.
Шаблон [a-z является примером недопустимого шаблона, так как ему не хватает закрывающей квадратной скобки.
Обратите внимание, что допустимость регулярного выражения также может зависеть от флага подстановок; например, *.html является допустимым регулярным выражением с подстановкой, но недопустимым регулярным выражением с полным регулярным выражением.
См. также errorString().
int QRegExp::lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const
Попытка найти совпадение назад в str с позиции offset. Если offset равно -1 (по умолчанию), поиск начинается с последнего символа; если -2, со второго по последнему и так далее.
Возвращает позицию первого совпадения или -1, если совпадения не было.
Параметр caretMode можно использовать для указания, должно ли ^ соответствовать индексу 0 или offset.
Несмотря на то, что функция является константной, она устанавливает matchedLength(), capturedTexts() и pos().
Предупреждение: Поиск назад намного медленнее, чем поиск вперед.
См. также indexIn() и exactMatch().
int QRegExp::lastIndexIn(const QStringList &list, int from) const
Возвращает индекс последнего точного совпадения этого регулярного выражения в list, выполняя поиск назад с индекса from. Если from равно -1 (по умолчанию), поиск начинается с последнего элемента. Возвращает -1, если ни один элемент не совпал.
См. также QRegExp::exactMatch().
int QRegExp::matchedLength() const
Возвращает длину последней сопоставленной строки или -1, если совпадения не было.
См. также exactMatch(), indexIn() и lastIndexIn().
QString QRegExp::pattern() const
Возвращает строку шаблона регулярного выражения. Шаблон имеет синтаксис регулярного выражения или синтаксис с подстановкой, в зависимости от patternSyntax().
См. также setPattern(), patternSyntax() и caseSensitivity().
QRegExp::PatternSyntax QRegExp::patternSyntax() const
Возвращает синтаксис, используемый регулярным выражением. По умолчанию используется QRegExp::RegExp.
См. также setPatternSyntax(), pattern() и caseSensitivity().
int QRegExp::pos(int nth = 0) const
Возвращает позицию nth захваченного текста в строке поиска. Если nth равно 0 (по умолчанию), pos() возвращает позицию всего совпадения.
Пример:
QRegExp rx("/([a-z]+)/([a-z]+)");
rx.indexIn("Output /dev/null"); // returns 7 (position of /dev/null)
rx.pos(0); // returns 7 (position of /dev/null)
rx.pos(1); // returns 8 (position of dev)
rx.pos(2); // returns 12 (position of null) Для совпадений нулевой длины pos() всегда возвращает -1. (Например, если cap(4) вернёт пустую строку, pos(4) вернёт -1.) Это особенность реализации.
См. также cap() и capturedTexts().
QString QRegExp::removeIn(const QString &str) const
Удаляет все вхождения этого регулярного выражения из str и возвращает результат.
Делает то же самое, что и replaceIn(str, QString()).
См. также indexIn(), lastIndexIn() и replaceIn().
QString QRegExp::replaceIn(const QString &str, const QString &after) const
Заменяет все вхождения этого регулярного выражения в str на after и возвращает результат.
Для регулярных выражений, содержащих захватывающие скобки, вхождения \1, \2, ..., в after заменяются на rx.cap(1), cap(2), ...
См. также indexIn(), lastIndexIn() и QRegExp::cap().
QStringList QRegExp::replaceIn(const QStringList &stringList, const QString &after) const
Заменяет каждое вхождение данного регулярного выражения в каждом элементе stringList на after. Возвращает ссылку на список строк.
void QRegExp::setCaseSensitivity(Qt::CaseSensitivity cs)
Устанавливает чувствительность к регистру в соответствии с cs.
Если cs равна Qt::CaseSensitive, \.txt$ соответствует readme.txt но не README.TXT.
См. также caseSensitivity(), setPatternSyntax(), setPattern() и setMinimal().
void QRegExp::setMinimal(bool minimal)
Включает или выключает минимальный поиск. Если minimal равно false, поиск является жадным (максимальным), что является значением по умолчанию.
Например, предположим, что у нас есть строка «Мы должны быть <b>жирными</b>, очень <b>жирными</b>!» и шаблон <b>.*</b>. При использовании по умолчанию жадного (максимального) поиска совпадением является «Мы должны быть <b>жирными</b>, очень <b>жирными</b>!». Но при минимальном (не жадном) поиске первое совпадение — «Мы должны быть <b>жирными</b>, очень <b>жирными</b>!», а второе — «Мы должны быть <b>жирными</b>, очень <b>жирными</b>!». На практике мы, возможно, использовали бы шаблон <b>[^<]*</b> вместо него, хотя и это по-прежнему не сработает для вложенных тегов.
См. также isMinimal() и setCaseSensitivity().
void QRegExp::setPattern(const QString &pattern)
Устанавливает строку шаблона в шаблон. Чувствительность к регистру, символы-заменители и минимальные параметры соответствия не изменяются.
См. также pattern(), setPatternSyntax() и setCaseSensitivity().
void QRegExp::setPatternSyntax(QRegExp::PatternSyntax синтаксис)
Устанавливает режим синтаксиса для регулярного выражения. По умолчанию используется QRegExp::RegExp.
Установка синтаксиса в QRegExp::Wildcard включает простые режимы соответствия по шаблонам, подобные оболочке. Например, r*.txt соответствует строке readme.txt в режиме шаблонов, но не соответствует readme.
Установка синтаксиса в QRegExp::FixedString означает, что шаблон интерпретируется как обычная строка. Специальные символы (например, обратный слэш) при этом не требуют экранирования.
См. также patternSyntax(), setPattern(), setCaseSensitivity() и escape().
QStringList QRegExp::splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const
Разделяет str на подстроки там, где совпадает это регулярное выражение, и возвращает список этих строк. Если это регулярное выражение не совпадает нигде в строке, split() возвращает список с единственным элементом, содержащим str.
Если behavior установлено в Qt::KeepEmptyParts, пустые поля включаются в результирующий список.
См. также QStringList::join() и QString::split().
void QRegExp::swap(QRegExp &other)
Меняет местами регулярное выражение other с этим регулярным выражением. Эта операция очень быстрая и никогда не терпит неудачу.
QVariant QRegExp::operator QVariant() const
Возвращает регулярное выражение как QVariant
bool QRegExp::operator!=(const QRegExp &rx) const
Возвращает true если это регулярное выражение не равно rx; в противном случае возвращает false.
См. также operator==().
bool QRegExp::operator==(const QRegExp &rx) const
Возвращает true если это регулярное выражение равно rx; в противном случае возвращает false.
Два объекта QRegExp равны, если у них одинаковые строки шаблонов и одинаковые настройки чувствительности к регистру, символов-заменителей и минимального соответствия.
Связанные нечлен-функции
[since 5.6] size_t qHash(const QRegExp &key, size_t seed = 0)
Возвращает значение хэш-функции для key, используя seed для инициализации вычисления.
Эта функция была добавлена в Qt 5.6.
QDataStream &operator<<(QDataStream &out, const QRegExp ®Exp)
Записывает регулярное выражение regExp в поток out.
См. также Сериализация типов данных Qt.
QDataStream &operator>>(QDataStream &in, QRegExp ®Exp)
Считывает регулярное выражение из потока in в regExp.
См. также Сериализация типов данных Qt.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qregexp.html