QRegularExpression: support for QStringList overloads

Change-Id: Ia9017348742e41187684185d04b56d27edd383b5
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Giuseppe D'Angelo 2012-03-13 07:24:27 +00:00 committed by Qt by Nokia
parent 054b69c963
commit 8659495202
4 changed files with 254 additions and 18 deletions

View File

@ -144,6 +144,21 @@ Widget::Widget(QWidget *parent)
list.replaceInStrings(QRegExp("^(.*), (.*)$"), "\\2 \\1");
// list == ["Bill Clinton", "Bill Murray"]
//! [15]
list.clear();
//! [16]
list << "alpha" << "beta" << "gamma" << "epsilon";
list.replaceInStrings(QRegularExpression("^a"), "o");
// list == ["olpha", "beta", "gamma", "epsilon"]
//! [16]
list.clear();
//! [17]
list << "Bill Clinton" << "Murray, Bill";
list.replaceInStrings(QRegularExpression("^(.*), (.*)$"), "\\2 \\1");
// list == ["Bill Clinton", "Bill Murray"]
//! [17]
}
int main(int argc, char *argv[])

View File

@ -41,6 +41,7 @@
#include <qstringlist.h>
#include <qset.h>
#include <qregularexpression.h>
QT_BEGIN_NAMESPACE
@ -304,6 +305,28 @@ QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegExp
}
#endif
#ifndef QT_BOOTSTRAPPED
#ifndef QT_NO_REGEXP
/*!
\fn QStringList QStringList::filter(const QRegularExpression &re) const
\overload
\since 5.0
Returns a list of all the strings that match the regular
expression \a re.
*/
QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegularExpression &re)
{
QStringList res;
for (int i = 0; i < that->size(); ++i) {
if (that->at(i).contains(re))
res << that->at(i);
}
return res;
}
#endif // QT_NO_REGEXP
#endif // QT_BOOTSTRAPPED
/*!
\fn QStringList &QStringList::replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
@ -357,6 +380,39 @@ void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QRegExp &r
}
#endif
#ifndef QT_BOOTSTRAPPED
#ifndef QT_NO_REGEXP
/*!
\fn QStringList &QStringList::replaceInStrings(const QRegularExpression &re, const QString &after)
\overload
\since 5.0
Replaces every occurrence of the regular expression \a re, in each of the
string lists's strings, with \a after. Returns a reference to the string
list.
For example:
\snippet doc/src/snippets/qstringlist/main.cpp 5
\snippet doc/src/snippets/qstringlist/main.cpp 16
For regular expressions that contain capturing groups,
occurrences of \b{\\1}, \b{\\2}, ..., in \a after are
replaced with the string captured by the corresponding capturing group.
For example:
\snippet doc/src/snippets/qstringlist/main.cpp 5
\snippet doc/src/snippets/qstringlist/main.cpp 17
*/
void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QRegularExpression &re, const QString &after)
{
for (int i = 0; i < that->size(); ++i)
(*that)[i].replace(re, after);
}
#endif // QT_NO_REGEXP
#endif // QT_BOOTSTRAPPED
/*!
\fn QString QStringList::join(const QString &separator) const
@ -542,6 +598,67 @@ int QtPrivate::QStringList_lastIndexOf(const QStringList *that, QRegExp &rx, int
}
#endif
#ifndef QT_BOOTSTRAPPED
#ifndef QT_NO_REGEXP
/*!
\fn int QStringList::indexOf(const QRegularExpression &re, int from) const
\overload
\since 5.0
Returns the index position of the first match of \a re in
the list, searching forward from index position \a from. Returns
-1 if no item matched.
\sa lastIndexOf()
*/
int QtPrivate::QStringList_indexOf(const QStringList *that, const QRegularExpression &re, int from)
{
if (from < 0)
from = qMax(from + that->size(), 0);
QString exactPattern = QLatin1String("\\A(?:") + re.pattern() + QLatin1String(")\\z");
QRegularExpression exactRe(exactPattern, re.patternOptions());
for (int i = from; i < that->size(); ++i) {
QRegularExpressionMatch m = exactRe.match(that->at(i));
if (m.hasMatch())
return i;
}
return -1;
}
/*!
\fn int QStringList::lastIndexOf(const QRegularExpression &re, int from) const
\overload
\since 5.0
Returns the index position of the last exact match of \a re in
the list, searching backward from index position \a from. If \a
from is -1 (the default), the search starts at the last item.
Returns -1 if no item matched.
\sa indexOf()
*/
int QtPrivate::QStringList_lastIndexOf(const QStringList *that, const QRegularExpression &re, int from)
{
if (from < 0)
from += that->size();
else if (from >= that->size())
from = that->size() - 1;
QString exactPattern = QLatin1String("\\A(?:") + re.pattern() + QLatin1String(")\\z");
QRegularExpression exactRe(exactPattern, re.patternOptions());
for (int i = from; i >= 0; --i) {
QRegularExpressionMatch m = exactRe.match(that->at(i));
if (m.hasMatch())
return i;
}
return -1;
}
#endif // QT_NO_REGEXP
#endif // QT_BOOTSTRAPPED
/*!
\fn int QStringList::indexOf(const QString &value, int from = 0) const

View File

@ -55,6 +55,7 @@ QT_BEGIN_NAMESPACE
class QRegExp;
class QRegularExpression;
typedef QListIterator<QString> QStringListIterator;
typedef QMutableListIterator<QString> QMutableStringListIterator;
@ -95,6 +96,16 @@ public:
inline int indexOf(QRegExp &rx, int from = 0) const;
inline int lastIndexOf(QRegExp &rx, int from = -1) const;
#endif
#ifndef QT_BOOTSTRAPPED
#ifndef QT_NO_REGEXP
inline QStringList filter(const QRegularExpression &re) const;
inline QStringList &replaceInStrings(const QRegularExpression &re, const QString &after);
inline int indexOf(const QRegularExpression &re, int from = 0) const;
inline int lastIndexOf(const QRegularExpression &re, int from = -1) const;
#endif // QT_NO_REGEXP
#endif // QT_BOOTSTRAPPED
#if !defined(Q_NO_USING_KEYWORD)
using QList<QString>::indexOf;
using QList<QString>::lastIndexOf;
@ -127,6 +138,15 @@ namespace QtPrivate {
int Q_CORE_EXPORT QStringList_indexOf(const QStringList *that, QRegExp &rx, int from);
int Q_CORE_EXPORT QStringList_lastIndexOf(const QStringList *that, QRegExp &rx, int from);
#endif
#ifndef QT_BOOTSTRAPPED
#ifndef QT_NO_REGEXP
void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, const QRegularExpression &rx, const QString &after);
QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, const QRegularExpression &re);
int Q_CORE_EXPORT QStringList_indexOf(const QStringList *that, const QRegularExpression &re, int from);
int Q_CORE_EXPORT QStringList_lastIndexOf(const QStringList *that, const QRegularExpression &re, int from);
#endif // QT_NO_REGEXP
#endif // QT_BOOTSTRAPPED
}
inline void QStringList::sort()
@ -193,6 +213,30 @@ inline int QStringList::lastIndexOf(QRegExp &rx, int from) const
}
#endif
#ifndef QT_BOOTSTRAPPED
#ifndef QT_NO_REGEXP
inline QStringList &QStringList::replaceInStrings(const QRegularExpression &rx, const QString &after)
{
QtPrivate::QStringList_replaceInStrings(this, rx, after);
return *this;
}
inline QStringList QStringList::filter(const QRegularExpression &rx) const
{
return QtPrivate::QStringList_filter(this, rx);
}
inline int QStringList::indexOf(const QRegularExpression &rx, int from) const
{
return QtPrivate::QStringList_indexOf(this, rx, from);
}
inline int QStringList::lastIndexOf(const QRegularExpression &rx, int from) const
{
return QtPrivate::QStringList_lastIndexOf(this, rx, from);
}
#endif // QT_NO_REGEXP
#endif // QT_BOOTSTRAPPED
#ifndef QT_NO_DATASTREAM
inline QDataStream &operator>>(QDataStream &in, QStringList &list)

View File

@ -41,6 +41,7 @@
#include <QtTest/QtTest>
#include <qregexp.h>
#include <qregularexpression.h>
#include <qstringlist.h>
class tst_QStringList : public QObject
@ -72,18 +73,37 @@ void tst_QStringList::indexOf_regExp()
{
QStringList list;
list << "harald" << "trond" << "vohi" << "harald";
{
QRegExp re(".*o.*");
QRegExp re(".*o.*");
QCOMPARE(list.indexOf(re), 1);
QCOMPARE(list.indexOf(re, 2), 2);
QCOMPARE(list.indexOf(re, 3), -1);
QCOMPARE(list.indexOf(re), 1);
QCOMPARE(list.indexOf(re, 2), 2);
QCOMPARE(list.indexOf(re, 3), -1);
QCOMPARE(list.indexOf(QRegExp(".*x.*")), -1);
QCOMPARE(list.indexOf(re, -1), -1);
QCOMPARE(list.indexOf(re, -3), 1);
QCOMPARE(list.indexOf(re, -9999), 1);
QCOMPARE(list.indexOf(re, 9999), -1);
QCOMPARE(list.indexOf(QRegExp(".*x.*")), -1);
QCOMPARE(list.indexOf(re, -1), -1);
QCOMPARE(list.indexOf(re, -3), 1);
QCOMPARE(list.indexOf(re, -9999), 1);
QCOMPARE(list.indexOf(re, 9999), -1);
QCOMPARE(list.indexOf(QRegExp("[aeiou]")), -1);
}
{
QRegularExpression re(".*o.*");
QCOMPARE(list.indexOf(re), 1);
QCOMPARE(list.indexOf(re, 2), 2);
QCOMPARE(list.indexOf(re, 3), -1);
QCOMPARE(list.indexOf(QRegularExpression(".*x.*")), -1);
QCOMPARE(list.indexOf(re, -1), -1);
QCOMPARE(list.indexOf(re, -3), 1);
QCOMPARE(list.indexOf(re, -9999), 1);
QCOMPARE(list.indexOf(re, 9999), -1);
QCOMPARE(list.indexOf(QRegularExpression("[aeiou]")), -1);
}
}
void tst_QStringList::lastIndexOf_regExp()
@ -91,17 +111,39 @@ void tst_QStringList::lastIndexOf_regExp()
QStringList list;
list << "harald" << "trond" << "vohi" << "harald";
QRegExp re(".*o.*");
{
QRegExp re(".*o.*");
QCOMPARE(list.lastIndexOf(re), 2);
QCOMPARE(list.lastIndexOf(re, 2), 2);
QCOMPARE(list.lastIndexOf(re, 1), 1);
QCOMPARE(list.lastIndexOf(QRegExp(".*x.*")), -1);
QCOMPARE(list.lastIndexOf(re, -1), 2);
QCOMPARE(list.lastIndexOf(re, -3), 1);
QCOMPARE(list.lastIndexOf(re, -9999), -1);
QCOMPARE(list.lastIndexOf(re, 9999), 2);
QCOMPARE(list.lastIndexOf(QRegExp("[aeiou]")), -1);
}
{
QRegularExpression re(".*o.*");
QCOMPARE(list.lastIndexOf(re), 2);
QCOMPARE(list.lastIndexOf(re, 2), 2);
QCOMPARE(list.lastIndexOf(re, 1), 1);
QCOMPARE(list.lastIndexOf(QRegularExpression(".*x.*")), -1);
QCOMPARE(list.lastIndexOf(re, -1), 2);
QCOMPARE(list.lastIndexOf(re, -3), 1);
QCOMPARE(list.lastIndexOf(re, -9999), -1);
QCOMPARE(list.lastIndexOf(re, 9999), 2);
QCOMPARE(list.lastIndexOf(QRegularExpression("[aeiou]")), -1);
}
QCOMPARE(list.lastIndexOf(re), 2);
QCOMPARE(list.lastIndexOf(re, 2), 2);
QCOMPARE(list.lastIndexOf(re, 1), 1);
QCOMPARE(list.lastIndexOf(QRegExp(".*x.*")), -1);
QCOMPARE(list.lastIndexOf(re, -1), 2);
QCOMPARE(list.lastIndexOf(re, -3), 1);
QCOMPARE(list.lastIndexOf(re, -9999), -1);
QCOMPARE(list.lastIndexOf(re, 9999), 2);
}
void tst_QStringList::indexOf()
@ -149,6 +191,12 @@ void tst_QStringList::filter()
list3 = list3.filter( QRegExp("[i]ll") );
list4 << "Bill Gates" << "Bill Clinton";
QCOMPARE( list3, list4 );
QStringList list5, list6;
list5 << "Bill Gates" << "Joe Blow" << "Bill Clinton";
list5 = list5.filter( QRegularExpression("[i]ll") );
list6 << "Bill Gates" << "Bill Clinton";
QCOMPARE( list5, list6 );
}
void tst_QStringList::replaceInStrings()
@ -170,6 +218,18 @@ void tst_QStringList::replaceInStrings()
list6 << "Bill Clinton" << "Bill Gates";
list5.replaceInStrings( QRegExp("^(.*), (.*)$"), "\\2 \\1" );
QCOMPARE( list5, list6 );
QStringList list7, list8;
list7 << "alpha" << "beta" << "gamma" << "epsilon";
list7.replaceInStrings( QRegularExpression("^a"), "o" );
list8 << "olpha" << "beta" << "gamma" << "epsilon";
QCOMPARE( list7, list8 );
QStringList list9, list10;
list9 << "Bill Clinton" << "Gates, Bill";
list10 << "Bill Clinton" << "Bill Gates";
list9.replaceInStrings( QRegularExpression("^(.*), (.*)$"), "\\2 \\1" );
QCOMPARE( list9, list10 );
}
void tst_QStringList::contains()