Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果一个分隔符被括在方括号中,我怎么能用分隔符拆分一个Q字符串呢_C++_Qt_Qstring - Fatal编程技术网

C++ 如果一个分隔符被括在方括号中,我怎么能用分隔符拆分一个Q字符串呢

C++ 如果一个分隔符被括在方括号中,我怎么能用分隔符拆分一个Q字符串呢,c++,qt,qstring,C++,Qt,Qstring,如果我有一个QString,形式是QString s=QString(“a:B[1:2]:C:D”)我想用':'进行拆分,但仅限于不包含在方括号中的情况 因此,上述QString的设计输出将是“A”、“B[1:2]、“C”、“D” 现在,我只能想到在s.indexOf('[')和s.indexOf(']')的范围内替换:',然后拆分,然后在任何剩余拆分中替换回':',但这似乎相当不方便 编辑:根据评论和答案:方括号中的任何数字在拆分后应相同。有一些字符,例如:“;”我可以使用t作为“:”的临时替

如果我有一个QString,形式是
QString s=QString(“a:B[1:2]:C:D”)
我想用
':'
进行拆分,但仅限于不包含在方括号中的情况

因此,上述
QString
的设计输出将是
“A”、“B[1:2]、“C”、“D”

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

编辑:根据评论和答案:方括号中的任何数字在拆分后应相同。有一些字符,例如:“;”我可以使用t作为“:”的临时替换项。


还有更好的主意吗

可能远未达到最佳状态,但。。。您可以对“:”进行初始拆分,然后对结果进行后期处理,以合并包含“[”和“]”的项。所以,给定初始字符串,类似于

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);
  }
}
qstrings(“A:B[1:2]:C:D”);
QStringList l=s.split(“:”);
对于(int i=0;i

当然,这是假设任何给定的“[”,“]”对最多会有一个中间“:”。

可能远不是最优的,但是……您可以对“:”进行初始拆分,然后对结果进行后处理,合并包含“[”和“]”的项。因此,给定初始字符串,类似于

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);
  }
}
qstrings(“A:B[1:2]:C:D”);
QStringList l=s.split(“:”);
对于(int i=0;i

当然,这假设任何给定的“[”,“]”对都最多有一个中间“:”。

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

#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]");
    }
}

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

#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]");
    }
}

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

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

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;
}

并将其重新组合起来……

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

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

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;
}

然后把它放回一起…

但是数字的信息将永远丢失。我需要一个解决方案,使数字保持原样。保留数字。但是我将更新我的答案。:)这将接受范围
[0-9]
中的任何数字,但输出将始终是
[1:2]
@tobilocker:\\1和\\2是正则表达式捕获的内容。因此,如果我将原始的
[1:2]
替换为
[4:8],它将在此处输出正确使用的数字
。好的,我现在就测试一下。谢谢:)但是数字的信息将永远丢失。我需要一个解决方案,使数字保持原样。保留数字。不过,我会更新我的答案。:)这将获取范围
[0-9]
内的任何数字,但输出将始终是
[1:2]
@tobilocker:\\1和\\2是正则表达式捕获的内容。因此,如果我将原始的
[1:2]
替换为
[4:8],它将在此处输出正确使用的数字
。好的,我现在就来测试。谢谢:)所以您希望原始
QString中没有
是-或者说有一些限制,因为字符串是一个算术表达式,混合了三元条件和数组索引。这就是
?:
[开始:结束]冲突的地方
所以您希望原始
QString中没有
是-或者说有一些限制,因为字符串是一个算术表达式,混合了三元条件和数组索引。这就是
?:
[开始:结束]
冲突的地方