gpt4 book ai didi

c++ - 在 Qt 中从字符串中提取参数,包括引用区域

转载 作者:太空狗 更新时间:2023-10-29 23:39:59 26 4
gpt4 key购买 nike

我有一个 Qt5/C++ 程序,它接收一个包含程序名称和可能的参数的 QString。我需要将这个 QString 拆分成多个字符串。例如,字符串

/tmp/myprog --param1 --param2=2 --param3="1 2 3" -p 4

应该拆分成:

list[0]=/tmp/myprog
list[1]=--param1
list[2]=--param2=2
list[3]=--param3="1 2 3"
list[4]=-p 4

我的第一个想法是在空格上使用“split”方法,但这会破坏引用的 param3。同样,参数 4 在 -p 和 4 之间没有 : 或 =。

有没有简单的方法来做到这一点?我怀疑 -p 4 不可能轻易拆分,因为无法知道下面的 2 项是否在一起。

但是是否有拆分/正则表达式/其他方式来拆分以上内容? (如果我们忽略 -p 4 是否可能?)


更新:

同一个函数可以在不使用 --param 或 -p 的情况下拆分字符串吗?所以一串

abc "a a" "b b b"  c

会变成

list[0]=abc
list[1]="a a"
list[2]="b b b"
list[3]=c

最佳答案

你的任务有两个方面:

  1. 将命令行拆分为参数。这需要从头开始实现。

  2. 处理参数以提取参数及其值。从 Qt 5.2 开始,您可以使用 QCommandLineParser 来做到这一点。

#include <QCoreApplication>
#include <QCommandLineParser>
#include <QDebug>

static QStringList splitCommandLine(const QString & cmdLine)
{
QStringList list;
QString arg;
bool escape = false;
enum { Idle, Arg, QuotedArg } state = Idle;
foreach (QChar const c, cmdLine) {
if (!escape && c == '\\') { escape = true; continue; }
switch (state) {
case Idle:
if (!escape && c == '"') state = QuotedArg;
else if (escape || !c.isSpace()) { arg += c; state = Arg; }
break;
case Arg:
if (!escape && c == '"') state = QuotedArg;
else if (escape || !c.isSpace()) arg += c;
else { list << arg; arg.clear(); state = Idle; }
break;
case QuotedArg:
if (!escape && c == '"') state = arg.isEmpty() ? Idle : Arg;
else arg += c;
break;
}
escape = false;
}
if (!arg.isEmpty()) list << arg;
return list;
}

int main(int argc, char * argv[])
{
QCoreApplication app(argc, argv);
QCommandLineParser parser;
parser.addHelpOption();
QCommandLineOption param1("param1");
QCommandLineOption param2("param2", "", "val2");
QCommandLineOption param3("param3", "", "val3");
QCommandLineOption param4("p", "", "val4");
parser.addOption(param1);
parser.addOption(param2);
parser.addOption(param3);
parser.addOption(param4);
if (true) {
// Parse a string
QString cmdLine("/tmp/myprog --param1 --param2=2\\ 2 --param3=\"1 2 3\" -p 4");
parser.parse(splitCommandLine(cmdLine));
} else {
// Parse a command line passed to this application
parser.process(app);
}
if (parser.isSet(param1)) qDebug() << "param1";
if (parser.isSet(param2)) qDebug() << "param2:" << parser.value(param2);
if (parser.isSet(param3)) {
QStringList values = parser.value(param3)
.split(' ', QString::SkipEmptyParts);
qDebug() << "param3:" << values;
}
if (parser.isSet(param4)) qDebug() << "param4:" << parser.value(param4);
return 0;
}

输出:

param1
param2: "2 2"
param3: ("1", "2", "3")
param4: "4"

QDebug 引用它输出的字符串。字符串本身不包含任何引号。

关于c++ - 在 Qt 中从字符串中提取参数,包括引用区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25068750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com