我对使用正则表达式相当陌生。
我得到了一个字符串,它可以包含带引号和不带引号的子字符串。
以下是它们的外观示例:
"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]+
-除"
和空白之外的一个或多个字符
请参阅更新的模式演示。