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



我对使用正则表达式相当陌生。

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

以下是它们的外观示例:

"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中测试它会显示我想要的结果。我还在其他一些网站上测试过,比如这个。

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

提前谢谢。

您假设需要从中获取值的组将在每次新匹配时更改其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]+-除"和空白之外的一个或多个字符

请参阅更新的模式演示。

相关内容

  • 没有找到相关文章

最新更新