Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qregularexpression.h
Go to the documentation of this file.
1// Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
2// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
3// Copyright (C) 2021 The Qt Company Ltd.
4// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
5
6#ifndef QREGULAREXPRESSION_H
7#define QREGULAREXPRESSION_H
8
9#include <QtCore/qglobal.h>
10#include <QtCore/qstring.h>
11#include <QtCore/qstringview.h>
12#include <QtCore/qshareddata.h>
13#include <QtCore/qvariant.h>
14
15#include <iterator>
16
17QT_REQUIRE_CONFIG(regularexpression);
18
20
25
27
28Q_CORE_EXPORT size_t qHash(const QRegularExpression &key, size_t seed = 0) noexcept;
29
30class Q_CORE_EXPORT QRegularExpression
31{
32public:
42 // Formerly (no-ops deprecated in 5.12, removed 6.0):
43 // OptimizeOnFirstUsageOption = 0x0080,
44 // DontAutomaticallyOptimizeOption = 0x0100,
45 };
46 Q_DECLARE_FLAGS(PatternOptions, PatternOption)
47
48 PatternOptions patternOptions() const;
49 void setPatternOptions(PatternOptions options);
50
52 explicit QRegularExpression(const QString &pattern, PatternOptions options = NoPatternOption);
57 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QRegularExpression)
58
59 void swap(QRegularExpression &other) noexcept { d.swap(other.d); }
60
61 QString pattern() const;
62 void setPattern(const QString &pattern);
63
64 [[nodiscard]]
65 bool isValid() const;
67 QString errorString() const;
68
69 int captureCount() const;
71
72 enum MatchType {
77 };
78
80 NoMatchOption = 0x0000,
82 AnchoredMatchOption Q_DECL_ENUMERATOR_DEPRECATED_X(
83 "Use AnchorAtOffsetMatchOption instead") = AnchorAtOffsetMatchOption, // Rename@Qt6.0
85 };
86 Q_DECLARE_FLAGS(MatchOptions, MatchOption)
87
88 [[nodiscard]]
90 qsizetype offset = 0,
91 MatchType matchType = NormalMatch,
92 MatchOptions matchOptions = NoMatchOption) const;
93
94#if QT_DEPRECATED_SINCE(6, 8)
95 [[nodiscard]]
96 QT_DEPRECATED_VERSION_X_6_8("Use matchView instead.")
98 qsizetype offset = 0,
99 MatchType matchType = NormalMatch,
100 MatchOptions matchOptions = NoMatchOption) const;
101#endif
102
103 [[nodiscard]]
105 qsizetype offset = 0,
106 MatchType matchType = NormalMatch,
107 MatchOptions matchOptions = NoMatchOption) const;
108
109 [[nodiscard]]
111 qsizetype offset = 0,
112 MatchType matchType = NormalMatch,
113 MatchOptions matchOptions = NoMatchOption) const;
114
115#if QT_DEPRECATED_SINCE(6, 8)
116 [[nodiscard]]
117 QT_DEPRECATED_VERSION_X_6_8("Use globalMatchView instead.")
119 qsizetype offset = 0,
120 MatchType matchType = NormalMatch,
121 MatchOptions matchOptions = NoMatchOption) const;
122#endif
123
124 [[nodiscard]]
126 qsizetype offset = 0,
127 MatchType matchType = NormalMatch,
128 MatchOptions matchOptions = NoMatchOption) const;
129
130 void optimize() const;
131
136 };
137 Q_DECLARE_FLAGS(WildcardConversionOptions, WildcardConversionOption)
138
139 static QString escape(const QString &str)
140 {
142 }
143
144 static QString wildcardToRegularExpression(const QString &str, WildcardConversionOptions options = DefaultWildcardConversion)
145 {
147 }
148
149 static inline QString anchoredPattern(const QString &expression)
150 {
151 return anchoredPattern(qToStringViewIgnoringNull(expression));
152 }
153
155 static QString wildcardToRegularExpression(QStringView str, WildcardConversionOptions options = DefaultWildcardConversion);
156 static QString anchoredPattern(QStringView expression);
157
159 WildcardConversionOptions options = DefaultWildcardConversion);
160
161 bool operator==(const QRegularExpression &re) const;
162 inline bool operator!=(const QRegularExpression &re) const { return !operator==(re); }
163
164private:
169 friend Q_CORE_EXPORT size_t qHash(const QRegularExpression &key, size_t seed) noexcept;
170
173};
174
175Q_DECLARE_SHARED(QRegularExpression)
176Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::PatternOptions)
177Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::MatchOptions)
178
179#ifndef QT_NO_DATASTREAM
182#endif
183
184#ifndef QT_NO_DEBUG_STREAM
186Q_CORE_EXPORT QDebug operator<<(QDebug debug, QRegularExpression::PatternOptions patternOptions);
187#endif
188
191
192class Q_CORE_EXPORT QRegularExpressionMatch
193{
194public:
201 { d.swap(match.d); return *this; }
202 void swap(QRegularExpressionMatch &other) noexcept { d.swap(other.d); }
203
206 QRegularExpression::MatchOptions matchOptions() const;
207
208 bool hasMatch() const;
209 bool hasPartialMatch() const;
210
211 bool isValid() const;
212
213 int lastCapturedIndex() const;
214
215 bool hasCaptured(const QString &name) const
216 { return hasCaptured(QStringView(name)); }
217 bool hasCaptured(QStringView name) const;
218 bool hasCaptured(int nth) const;
219
220 QString captured(int nth = 0) const;
221 QStringView capturedView(int nth = 0) const;
222
224 { return captured(QStringView(name)); }
225 QString captured(QStringView name) const;
226 QStringView capturedView(QStringView name) const;
227
228 QStringList capturedTexts() const;
229
230 qsizetype capturedStart(int nth = 0) const;
231 qsizetype capturedLength(int nth = 0) const;
232 qsizetype capturedEnd(int nth = 0) const;
233
235 { return capturedStart(QStringView(name)); }
237 { return capturedLength(QStringView(name)); }
239 { return capturedEnd(QStringView(name)); }
240
241 qsizetype capturedStart(QStringView name) const;
242 qsizetype capturedLength(QStringView name) const;
243 qsizetype capturedEnd(QStringView name) const;
244
245private:
246 friend class QRegularExpression;
249
252};
253
254Q_DECLARE_SHARED(QRegularExpressionMatch)
255
256#ifndef QT_NO_DEBUG_STREAM
258#endif
259
260namespace QtPrivate {
261class QRegularExpressionMatchIteratorRangeBasedForIterator;
263}
264
267
269{
270public:
277 { d.swap(iterator.d); return *this; }
278 void swap(QRegularExpressionMatchIterator &other) noexcept { d.swap(other.d); }
279
280 bool isValid() const;
281
282 bool hasNext() const;
284 QRegularExpressionMatch peekNext() const;
285
288 QRegularExpression::MatchOptions matchOptions() const;
289
290private:
291 friend class QRegularExpression;
294
297};
298
299namespace QtPrivate {
300
301// support for range-based for loop
303{
304public:
306 using difference_type = int;
309 using iterator_category = std::forward_iterator_tag;
310
312 : m_atEnd(true)
313 {
314 }
315
317 : m_matchIterator(iterator),
318 m_currentMatch(),
319 m_atEnd(false)
320 {
321 ++*this;
322 }
323
325 {
326 Q_ASSERT_X(!m_atEnd, Q_FUNC_INFO, "operator* called on an iterator already at the end");
327 return m_currentMatch;
328 }
329
331 {
332 Q_ASSERT_X(!m_atEnd, Q_FUNC_INFO, "operator++ called on an iterator already at the end");
333 if (m_matchIterator.hasNext()) {
334 m_currentMatch = m_matchIterator.next();
335 } else {
336 m_currentMatch = QRegularExpressionMatch();
337 m_atEnd = true;
338 }
339
340 return *this;
341 }
342
344 {
346 ++*this;
347 return i;
348 }
349
350private:
351 // [input.iterators] imposes operator== on us. Unfortunately, it's not
352 // trivial to implement, so just do the bare minimum to satifisfy
353 // Cpp17EqualityComparable.
356 {
357 return (&lhs == &rhs);
358 }
359
362 {
363 return !(lhs == rhs);
364 }
365
366 // This is what we really use in a range-based for.
369 {
370 return lhs.m_atEnd;
371 }
372
375 {
376 return !lhs.m_atEnd;
377 }
378
379 QRegularExpressionMatchIterator m_matchIterator;
380 QRegularExpressionMatch m_currentMatch;
381 bool m_atEnd;
382};
383
384} // namespace QtPrivate
385
386Q_DECLARE_SHARED(QRegularExpressionMatchIterator)
387
389
390#endif // QREGULAREXPRESSION_H
\inmodule QtCore\reentrant
Definition qdatastream.h:30
\inmodule QtCore
\inmodule QtCore \reentrant
QRegularExpressionMatchIterator(QRegularExpressionMatchIterator &&iterator)=default
QRegularExpressionMatch next()
Returns the next match result and advances the iterator by one position.
void swap(QRegularExpressionMatchIterator &other) noexcept
Swaps the iterator other with this iterator object.
bool hasNext() const
Returns true if there is at least one match result ahead of the iterator; otherwise it returns false.
friend QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIteratorSentinel end(const QRegularExpressionMatchIterator &)
QRegularExpressionMatchIterator & operator=(QRegularExpressionMatchIterator &&iterator) noexcept
Move-assigns the iterator to this object, and returns a reference to the result.
\inmodule QtCore \reentrant
qsizetype capturedEnd(const QString &name) const
Returns the offset inside the subject string immediately after the ending position of the substring c...
void swap(QRegularExpressionMatch &other) noexcept
Swaps the match result other with this match result.
QRegularExpressionMatch & operator=(QRegularExpressionMatch &&match) noexcept
Move-assigns the match result match to this object, and returns a reference to the result.
bool hasCaptured(const QString &name) const
QRegularExpressionMatch(QRegularExpressionMatch &&match)=default
qsizetype capturedStart(const QString &name) const
Returns the offset inside the subject string corresponding to the starting position of the substring ...
qsizetype capturedLength(const QString &name) const
Returns the length of the substring captured by the capturing group named name.
QString captured(const QString &name) const
Returns the substring captured by the capturing group named name.
\inmodule QtCore \reentrant
QRegularExpression(const QRegularExpression &re) noexcept
Constructs a QRegularExpression object as a copy of re.
~QRegularExpression()
Destroys the QRegularExpression object.
bool isValid() const
Returns true if the regular expression is a valid regular expression (that is, it contains no syntax ...
MatchOption
\value NoMatchOption No match options are set.
PatternOptions patternOptions() const
Returns the pattern options for the regular expression.
bool operator!=(const QRegularExpression &re) const
Returns true if the regular expression is different from re, or false otherwise.
void setPatternOptions(PatternOptions options)
Sets the given options as the pattern options of the regular expression.
int captureCount() const
Returns the number of capturing groups inside the pattern string, or -1 if the regular expression is ...
QRegularExpression & operator=(const QRegularExpression &re) noexcept
Assigns the regular expression re to this object, and returns a reference to the copy.
qsizetype patternErrorOffset() const
Returns the offset, inside the pattern string, at which an error was found when checking the validity...
static QRegularExpression fromWildcard(QStringView pattern, Qt::CaseSensitivity cs=Qt::CaseInsensitive, WildcardConversionOptions options=DefaultWildcardConversion)
void setPattern(const QString &pattern)
Sets the pattern string of the regular expression to pattern.
QStringList namedCaptureGroups() const
PatternOption
The PatternOption enum defines modifiers to the way the pattern string should be interpreted,...
MatchType
The MatchType enum defines the type of the match that should be attempted against the subject string.
friend class QRegularExpressionMatchIterator
QRegularExpression(QRegularExpression &&re)=default
QRegularExpressionMatch matchView(QStringView subjectView, qsizetype offset=0, MatchType matchType=NormalMatch, MatchOptions matchOptions=NoMatchOption) const
QRegularExpressionMatchIterator globalMatchView(QStringView subjectView, qsizetype offset=0, MatchType matchType=NormalMatch, MatchOptions matchOptions=NoMatchOption) const
QString errorString() const
Returns a textual description of the error found when checking the validity of the regular expression...
QRegularExpressionMatchIterator globalMatch(const QString &subject, qsizetype offset=0, MatchType matchType=NormalMatch, MatchOptions matchOptions=NoMatchOption) const
Attempts to perform a global match of the regular expression against the given subject string,...
static QString anchoredPattern(const QString &expression)
static QString wildcardToRegularExpression(const QString &str, WildcardConversionOptions options=DefaultWildcardConversion)
QRegularExpression()
Constructs a QRegularExpression object with an empty pattern and no pattern options.
QSharedData & operator=(const QSharedData &)=delete
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:76
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
QRegularExpressionMatchIteratorRangeBasedForIterator operator++(int)
QRegularExpressionMatchIteratorRangeBasedForIterator(const QRegularExpressionMatchIterator &iterator)
friend bool operator!=(const QRegularExpressionMatchIteratorRangeBasedForIterator &lhs, QRegularExpressionMatchIteratorRangeBasedForIteratorSentinel) noexcept
friend bool operator==(const QRegularExpressionMatchIteratorRangeBasedForIterator &lhs, QRegularExpressionMatchIteratorRangeBasedForIteratorSentinel) noexcept
QRegularExpressionMatchIteratorRangeBasedForIterator & operator++()
friend bool operator==(const QRegularExpressionMatchIteratorRangeBasedForIterator &lhs, const QRegularExpressionMatchIteratorRangeBasedForIterator &rhs) noexcept
friend bool operator!=(const QRegularExpressionMatchIteratorRangeBasedForIterator &lhs, const QRegularExpressionMatchIteratorRangeBasedForIterator &rhs) noexcept
QString str
[2]
short next
Definition keywords.cpp:445
Combined button and popup list for selecting options.
\macro QT_NAMESPACE
CaseSensitivity
@ CaseInsensitive
#define Q_DECL_ENUMERATOR_DEPRECATED_X(x)
#define Q_FUNC_INFO
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
#define Q_DECLARE_FLAGS(Flags, Enum)
Definition qflags.h:174
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
Definition qflags.h:194
GLuint64 key
GLenum GLuint GLintptr offset
GLuint name
GLuint in
GLubyte * pattern
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
Definition qrandom.cpp:196
bool operator==(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
Definition qrandom.cpp:1219
#define Q_ASSERT_X(cond, x, msg)
Definition qrandom.cpp:48
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
Q_CORE_EXPORT size_t qHash(const QRegularExpression &key, size_t seed=0) noexcept
Q_CORE_EXPORT QDataStream & operator<<(QDataStream &out, const QRegularExpression &re)
Q_CORE_EXPORT QDataStream & operator>>(QDataStream &in, QRegularExpression &re)
#define QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(Class, ExportMacro)
QStringView qToStringViewIgnoringNull(const QStringLike &s) noexcept
static bool hasNext(const Symbols &symbols, int i)
Definition main.cpp:66
#define QT_REQUIRE_CONFIG(feature)
#define QT_DEPRECATED_VERSION_X_6_8(text)
static bool match(const uchar *found, uint foundLen, const char *target, uint targetLen)
ptrdiff_t qsizetype
Definition qtypes.h:70
static QString escape(const QString &input)
QTextStream out(stdout)
[7]
QSharedPointer< T > other(t)
[5]
const QRegularExpression::MatchOptions matchOptions
const QRegularExpression::MatchType matchType
const QRegularExpression::MatchType matchType
const QRegularExpression::MatchOptions matchOptions
const QRegularExpression regularExpression