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]+
- "
和空格以外的一个或多个字符。
我对使用正则表达式还很陌生。
我得到一个字符串,它可以包含带引号和不带引号的子字符串。
以下是它们的外观示例:
"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]+
-"
和空格以外的一个或多个字符。