如果该分隔符包含在方括号中,我如何通过分隔符拆分 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(";", ":");
}
然后把它放回去...
如果我有一个 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(";", ":");
}
然后把它放回去...