如果该分隔符包含在方括号中,我如何通过分隔符拆分 QString 而不是

How can i split a QString by a delimiter and not if that delimiter is somewhere enclosed in square-brackets

如果我有一个 QString s = QString("A:B[1:2]:C:D"); 形式的 QString,我想以某种方式拆分 ':',但前提是没有用方括号括起来。

所以上述 QString 的输出将是 "A", "B[1:2]", "C", "D"

现在我只能想到在s.indexOf('[')s.indexOf(']')范围内替换':',然后拆分,然后替换回':'任何剩余的拆分,但这似乎很不方便。

编辑:根据评论和答案:拆分后方括号中的任何数字都应相同。有字符,例如:';'我可以使用 t 作为 ':'

的临时替代品

有更好的主意吗?

可能远非最佳,但是...您可以对“:”进行初始拆分,然后 post 处理结果以合并包含“[”和“]”的项目。因此,给定您的初始字符串,例如...

QString s("A:B[1:2]:C:D");
QStringList l = s.split(':');
for (int i = 0; i < l.size(); ++i) {
  if (l[i].contains('[')) {
    l[i] += ":" + l[i +1];
    l.takeAt(i + 1);
  }
}

当然,这假设任何给定的“[”、“]”对最多有一个插入“:”。

通常,我喜欢这里直接使用正则表达式进行拆分的想法,但我不能很快想出一个。所以这里是您的想法,首先用其他东西(这里是分号)替换不需要的冒号,然后拆分剩余的冒号并将分号替换回单独字符串上的冒号。

#include <QDebug>
#include <QRegularExpression>
#include <QString>

int main()
{
    QString string("A:B[1:2]:C:D");

    // This replaces all occurences of "[x:y]" by "[x;y]" with
    // x and y being digits.
    // \[ finds exactly the character '['. It has to be masked
    // by backslashes because it's a special character in regular
    // expressions.
    // (\d) is a capture for a digit that can be used in the
    // resulting string as \1, \2 and so on.
    string = string.replace(QRegularExpression("\[(\d):(\d)\]"), "[\1;\2]");

    // split on the remaining colons
    QStringList elements = string.split(':');

    // Iterate over all fractions the string was split into
    foreach(QString element, elements) {
        // Replace the semicolons back to colons.
        qDebug() << element.replace(QRegularExpression("\[(\d);(\d)\]"), "[\1:\2]");
    }
}

输出:

"A"
"B[1:2]"
"C"
"D"

我将提供我的工作代码作为答案,但接受任何更好的想法:

所以首先我替换方括号内的任何冒号:

QString ShuntingYard::replaceIndexColons(QString& expression)
{
    int index = 0;
    while (expression.indexOf('[', index) != -1)
    {
        int open = expression.indexOf('[', index);
        int close = expression.indexOf(']', open);
        int colon = expression.indexOf(':', open);
        if (colon > open && colon < close)
            expression.replace(colon, 1, ';');
        index = open + 1;
    }
    return expression;
}

然后,我可以用 splitExpression 拆分,这个拆分由几个分隔符组成,包括 :

expression = replaceIndexColons(expression);
QStringList list = splitExpression(expression);
Q_FOREACH(QString s, list)
{
    s.replace(";", ":");
}

然后把它放回去...