如何拆分 QString 并在 Qt 中保留分隔符?
How to split QString and keep the separator in Qt?
我有一个 QString:“{x, c | 0x01}”,我想将它拆分为 7 个标记下面:
{
x
,
c
|
0x01
}
在 Qt 中最好的方法是什么?
我尝试使用 QString::split(QRegExp("[\{\},|]"))
,但它没有在结果中保留分隔符。
基本上,您遍历字符串,检查是否找到分隔符,并将分隔符添加到列表中。如果没有找到分隔符,则将新的 'word' 添加到列表中,直到找到下一个分隔符,才会将字符添加到单词中。看看:
//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;
也许这个解决方案可以为您完成任务:
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)
,但在 for
循环之后使用 list.pop_front();
或 list.removeAll("");
,因为第一个元素将是垃圾 ""
。
这可以在单个正则表达式中完成,但必须使用前瞻和后视。
问题中指定的表达式 ([\{\},|]
) 将匹配由任何字符 {
、}
、,
或|
。 QString.split 然后将删除该 1 个字符的长字符串。
需要的是使用先行查找紧接在每个分隔符之前的零字符串:(?=[\{\},|])
以及紧接在分隔符 [=17 之后的零字符串=].
结合这些得到:
QString::split(QRegularExpression("(?=[\{\},|])|(?<=[\{\},|])"))
这将给出所需的输出:("{", "x", ",", "c", "|", "0x01", "}")
我有一个 QString:“{x, c | 0x01}”,我想将它拆分为 7 个标记下面:
{
x
,
c
|
0x01
}
在 Qt 中最好的方法是什么?
我尝试使用 QString::split(QRegExp("[\{\},|]"))
,但它没有在结果中保留分隔符。
基本上,您遍历字符串,检查是否找到分隔符,并将分隔符添加到列表中。如果没有找到分隔符,则将新的 'word' 添加到列表中,直到找到下一个分隔符,才会将字符添加到单词中。看看:
//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;
也许这个解决方案可以为您完成任务:
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)
,但在 for
循环之后使用 list.pop_front();
或 list.removeAll("");
,因为第一个元素将是垃圾 ""
。
这可以在单个正则表达式中完成,但必须使用前瞻和后视。
问题中指定的表达式 ([\{\},|]
) 将匹配由任何字符 {
、}
、,
或|
。 QString.split 然后将删除该 1 个字符的长字符串。
需要的是使用先行查找紧接在每个分隔符之前的零字符串:(?=[\{\},|])
以及紧接在分隔符 [=17 之后的零字符串=].
结合这些得到:
QString::split(QRegularExpression("(?=[\{\},|])|(?<=[\{\},|])"))
这将给出所需的输出:("{", "x", ",", "c", "|", "0x01", "}")