Выберите только одну опцию в двойных скобках QString

Я хочу очистить данные QString, чтобы иметь следующее:

вход

[[normal]], here's [[double phrased|brackets]]

выход

normal, here's double phrased

Просто выбрав первый элемент в каждом подкреплении, это нормально. Я не уверен, что самый оптимальный способ сделать это?

Кроме того, я использую Qt 4, так что это должно быть сделано QRegExp.

1

Решение

main.cpp

#include <QString>
#include <QDebug>
#include <QRegExp>

int main()
{
QRegExp rx("\\[{2}([^\\]\\|]+)(\\|[^\\]\\|]+)*\\]{2}");
QString mystr = "[[normal]], here's [[double phrased|brackets]]";

for (int pos = 0; (pos = rx.indexIn(mystr, pos)) != -1; pos += rx.matchedLength())
mystr.replace(pos, rx.matchedLength(), rx.cap(1));

qDebug() << mystr;

return 0;
}

компиляция

Возможно, вам понадобится немного другая команда, но она здесь только для справки, чтобы вы могли настроить ее для своей среды:

g++ -I/usr/include/qt4/QtCore -I/usr/include/qt4 -fPIC -lQtCore main.cpp && ./a.out

Выход

"normal, here's double phrased"

Обратите внимание, что с Qt 5 вы, вероятно, должны сходиться к QRegularExpression потом.

Кроме того, это хороший пример того, почему в определенных сценариях полезно избегать регулярных выражений. Написание функции замены здесь заняло бы у нас меньше времени, а конечный результат был бы более читабельным и, следовательно, обслуживаемым.

Спасибо за lancif за оригинальное вдохновение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]