diff options
author | Samuel Gaist <samuel.gaist@edeltech.ch> | 2017-11-10 16:48:50 +0100 |
---|---|---|
committer | Samuel Gaist <samuel.gaist@edeltech.ch> | 2018-03-30 16:34:30 +0000 |
commit | 6d0044f1dcffebc29dccd9d37d90f8abdb941a88 (patch) | |
tree | 88c679c19a188d976c5f5c89c7beeed5b08956b6 /src/corelib/tools/qregularexpression.cpp | |
parent | b1d71ef8ad9331f2f9f96ca29dcc297fa97e77a3 (diff) |
Add wildcard-to-regexp support to QRegularExpression
This method will make QRegularExpression on par with QRegExp and
will allow to replace this class when a wildcard expression can be
set through an API (e.g. QSortFilterProxyModel::setFilterWildcard).
For other use cases, see QTBUG-34052.
[ChangeLog][QRegularExpression] Implemented support for wildcard
patterns.
Warning: QRegularExpression might not give the exact same result
as QRegExp as its implementation follows strictly the glob patterns
definition for the wildcard expressions.
Change-Id: I5ed4617ca679159430c3d46da3449f6b3100e366
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Diffstat (limited to 'src/corelib/tools/qregularexpression.cpp')
-rw-r--r-- | src/corelib/tools/qregularexpression.cpp | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/corelib/tools/qregularexpression.cpp b/src/corelib/tools/qregularexpression.cpp index 13eff07c04..29ad578013 100644 --- a/src/corelib/tools/qregularexpression.cpp +++ b/src/corelib/tools/qregularexpression.cpp @@ -798,6 +798,83 @@ Q_AUTOTEST_EXPORT unsigned int qt_qregularexpression_optimize_after_use_count = static const unsigned int qt_qregularexpression_optimize_after_use_count = 10; #endif // QT_BUILD_INTERNAL + +namespace QtPrivate { +/*! + internal +*/ +QString wildcardToRegularExpression(const QString &wildcardString) +{ + const int wclen = wildcardString.length(); + QString rx; + int i = 0; + bool hasNegativeBracket = false; + const QChar *wc = wildcardString.unicode(); + + while (i < wclen) { + const QChar c = wc[i++]; + switch (c.unicode()) { + case '*': + rx += QLatin1String(".*"); + break; + case '?': + rx += QLatin1Char('.'); + break; + case '$': + case '(': + case ')': + case '+': + case '.': + case '^': + case '{': + case '|': + case '}': + rx += QLatin1Char('\\'); + rx += c; + break; + case '[': + // Support for the [!abc] or [!a-c] syntax + // Implements a negative look-behind for one char. + if (wc[i] == QLatin1Char(']')) { + rx += c; + rx += wc[i++]; + } else if (wc[i] == QLatin1Char('!')) { + rx += QLatin1String(".(?<"); + rx += wc[i++]; + rx += c; + hasNegativeBracket = true; + } else { + rx += c; + } + + if (i < wclen) { + if (rx[i] == QLatin1Char(']')) + rx += wc[i++]; + while (i < wclen && wc[i] != QLatin1Char(']')) { + if (wc[i] == QLatin1Char('\\')) + rx += QLatin1Char('\\'); + rx += wc[i++]; + } + } + break; + case ']': + rx += c; + // Closes the negative look-behind expression. + if (hasNegativeBracket) { + rx += QLatin1Char(')'); + hasNegativeBracket = false; + } + break; + default: + rx += c; + break; + } + } + + return rx; +} +} + /*! \internal */ @@ -1554,6 +1631,47 @@ void QRegularExpression::setPattern(const QString &pattern) } /*! + \since 5.12 + + Sets the pattern string of the regular expression to \a wildcard pattern. + The pattern options are left unchanged. + + \warning Unlike QRegExp, this implementation follows closely the definition + of wildcard for glob patterns: + \table + \row \li \b{c} + \li Any character represents itself apart from those mentioned + below. Thus \b{c} matches the character \e c. + \row \li \b{?} + \li Matches any single character. It is the same as + \b{.} in full regexps. + \row \li \b{*} + \li Matches zero or more of any characters. It is the + same as \b{.*} in full regexps. + \row \li \b{[abc]} + \li Matches one character given in the bracket. + \row \li \b{[a-c]} + \li Matches one character from the range given in the bracket. + \row \li \b{[!abc]} + \li Matches one character that is not given in the bracket. + \row \li \b{[!a-c]} + \li matches one character that is not from the range given in the + bracket. + \endtable + + \note This function generates a regular expression that will act following + the wildcard pattern given. However the content of the regular expression + will not be the same as the one set. + + \sa pattern(), setPattern() +*/ +void QRegularExpression::setWildcardPattern(const QString &pattern) +{ + setPattern(QtPrivate::wildcardToRegularExpression(pattern)); +} + + +/*! Returns the pattern options for the regular expression. \sa setPatternOptions(), pattern() |