我有一個QString的: 「{X,C | 0×01}」,我想它,如下拆分令牌:如何拆分QString並保持Qt中的分隔符?
{
x
,
c
|
0x01
}
什麼是做在Qt的最好方法是什麼?
我試圖使用QString::split(QRegExp("[\\{\\},|]"))
,但它不是保留結果中的分隔符。
我有一個QString的: 「{X,C | 0×01}」,我想它,如下拆分令牌:如何拆分QString並保持Qt中的分隔符?
{
x
,
c
|
0x01
}
什麼是做在Qt的最好方法是什麼?
我試圖使用QString::split(QRegExp("[\\{\\},|]"))
,但它不是保留結果中的分隔符。
也許這個解決方案可以爲您服務的任務:
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
週期之後,作爲第一元素將是垃圾""
。
基本上,你迭代通過字符串,檢查是否找到了定界符,然後將定界符添加到列表中。如果找不到分隔符,則將新的「詞」添加到列表中,直到找到下一個分隔符,字符將被添加到該詞中。請看:
//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;
感謝您的回答。實際上,我使用了一種非常類似於您的方法。但我想知道是否有更好的方法來避免調用str.insert()方法來提高性能? – ricky
你說得對,使用str.insert()是非常愚蠢的。看看我的新代碼,它使用StringBuilder連接到一個臨時字符串。 – travisjayday
我不明白,爲什麼你首先使用一個臨時字符串,然後再分割它,如果你可以直接將這些標記添加到'QStringList'中(因爲你已經有了這個標記!)! – xander
這可以在單個正則表達式中完成,但必須使用預見和後視。
在問題([\\{\\},|]
)指定的表達式將匹配的1字符長的字符串組成的任意字符{
,}
,,
或|
的。然後QString.split將刪除該長度爲1個字符的字符串。
需要的是使用前瞻:(?=[\\{\\},|])
找到緊靠每個分隔符之前的零字符字符串,並且還可以在分隔符(?<=[\\{\\},|])
之後立即找到零字符的字符串。
結合這些給出:
QString::split(QRegularExpression("(?=[\\{\\},|])|(?<=[\\{\\},|])"))
這將給所需的輸出:("{", "x", ",", "c", "|", "0x01", "}")
我不覺得在分離的任何邏輯,什麼是分割它的特點呢? – eyllanesc
我認爲你最好的選擇是迭代字符串並根據你的特定需求定義條件 –
@eyllanesc我想用deliminator char分割它:'{','}',',','|' – ricky