QRegularExpression 查找并捕获字符串中所有引用和非引用部分

QRegularExpression find and capture all quoted and non-quoated parts in string

我对使用正则表达式还很陌生。

我得到一个字符串,它可以包含带引号和不带引号的子字符串。

以下是它们的外观示例:

"path/to/program.exe" -a -b -c
"path/to/program.exe" -a -b -c
path/to/program.exe "-a" "-b" "-c"
path/to/program.exe "-a" -b -c

我的正则表达式如下所示:(("[^"]*")|([^"\t ]+))+

使用 ("[^"]+") 我试图找到每个引用的子字符串并捕获它。

使用 ([^"\t ]+) 我试图找到每个不带引号的子字符串。

我测试此行为的代码如下所示:

QString toMatch = R"del(     "path/to/program.exe" -a -b -c)del";
qDebug() << "String to Match against: " << toMatch << "\n";
QRegularExpression re(R"del((("[^"]+")|([^"\t ]+))+)del");
QRegularExpressionMatchIterator it = re.globalMatch(toMatch);
int i = 0;
while (it.hasNext())
{
   QRegularExpressionMatch match = it.next();
   qDebug() << "iteration: " << i << "  captured: " << match.captured(i) << "\n";
   i++;
}

输出:

String to Match against:  "     \"path/to/program.exe\" -a -b -c"

iteration:  0   captured:  "\"path/to/program.exe\""

iteration:  1   captured:  "-a"

iteration:  2   captured:  ""

iteration:  3   captured:  "-c"

Regex101 中对其进行测试显示了我想要的结果。 我还在其他一些网站上测试过它,例如 this.

我想我做错了什么,有人能指出正确的方向吗?

提前致谢。

您假设您需要从中获取价值的组将在每次新匹配时更改其 ID,而实际上,所有组 ID 都在模式本身中设置。

我建议删除所有组并只提取整个匹配值:

QString toMatch = R"del(     "path/to/program.exe" -a -b -c)del";
qDebug() << "String to Match against: " << toMatch << "\n";
QRegularExpression re(R"del("[^"]+"|[^"\s]+)del");
QRegularExpressionMatchIterator it = re.globalMatch(toMatch);
while (it.hasNext())
{
   QRegularExpressionMatch match = it.next();
   qDebug() << "  matched: " << match.captured(0) << "\n";
}

请注意 "[^"]+"|[^"\s]+ 模式匹配

  • "[^"]+" - ",然后是 " 以外的一个或多个字符,然后是 "
  • | - 或
  • [^"\s]+ - " 和空格以外的一个或多个字符。

参见updated pattern demo