C++ 如果一个分隔符被括在方括号中,我怎么能用分隔符拆分一个Q字符串呢
如果我有一个QString,形式是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 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中没有;
是-或者说有一些限制,因为字符串是一个算术表达式,混合了三元条件和数组索引。这就是?:
与[开始:结束]
冲突的地方