如何在Qt中拆分QString并保留分隔符?

问题描述 投票:0回答:4

我有一个 QString:“{x, c | 0x01}”,我想将其拆分为 7 标记,如下所示:

{
x
,
c
|
0x01
}

在 Qt 中执行此操作的最佳方法是什么?

我尝试使用

QString::split(QRegExp("[\\{\\},|]"))
,但它将分隔符保留在结果中。

qt qstring qregexp
4个回答
1
投票

也许这个解决方案可以满足您的任务:

int main(void) {
    QString str { "{x, c | 0x01}" };
    QRegExp separators { "[\\{\\},|]" };

    QStringList list;
    str.replace( " ", "" );

    int mem = 0;
    for(int i = 0; i<str.size(); ++i) {
        if(i == str.indexOf(separators, i)) {
            if(mem) list.append(str.mid(mem, i-mem)); // append str before separator
            list.append(str.mid(i, 1));               // append separator
            mem = i+1;
        }
    }

    qDebug() << list;

    return 0;
}

输出:

("{", "x", ",", "c", "|", "0x01", "}")

您可以消除

if(mem)
,但在
list.pop_front();
循环之后使用
list.removeAll("");
for
,因为第一个元素将是垃圾
""


1
投票


基本上,您遍历字符串,检查是否找到分隔符,然后将分隔符添加到列表中。如果未找到分隔符,则会将新的“单词”添加到列表中,并且在找到下一个分隔符之前,会将字符添加到该单词中。看看:

 //input string
QString str = "{x, c | 0x01}";
QList<QString> out;

//flag used to keep track of whether we're adding a mullti-char word, or just a deliminator
bool insideWord = false;

//remove whitespaces
str = str.simplified();
str = str.replace(" ", "");

//iterate through string, check for delims, populate out list
for (int i = 0; i < str.length(); i++)
{
    QChar c = str.at(i);    //get char at current index
    if (c == '{' || c == '}' || c == ',' || c == '|')
    {
        //append deliminator
        out.append(c);
        insideWord = false;
    }
    else
    {
        //append new word to qlist...
        if (!insideWord)
        {
            out.append(c);
            insideWord = true;
        }
        //but if word already started
        else
        {
            //add 'c' to the word in last index of the qlist
            out.last().append(c);
        }
    }
}

//output as requested by OP
qDebug() << "String is" << out;

0
投票

我不知道为什么@Tyr 在这里被否决,这个解决方案是 100% 的。我目前正在将它与我自己的分隔符集一起使用,以将我的字符串完全标记为带有两行代码的单词。太棒了,谢谢!


-1
投票

这可以在单个正则表达式中完成,但必须使用前瞻和后视。

问题 (

[\\{\\},|]
) 中指定的表达式将匹配由任意字符
{
}
,
|
组成的 1 个字符长字符串。然后 QString.split 将删除该 1 个字符的长字符串。

需要的是使用前瞻查找紧邻每个分隔符之前的零字符字符串:

(?=[\\{\\},|])
,并找到紧邻分隔符
(?<=[\\{\\},|])
之后的零字符字符串。

结合这些给出:

QString::split(QRegularExpression("(?=[\\{\\},|])|(?<=[\\{\\},|])"))

这将给出所需的输出:

("{", "x", ",", "c", "|", "0x01", "}")

© www.soinside.com 2019 - 2024. All rights reserved.