Regex 可选捕获组

Regex 可选捕获组,regex,qt,Regex,Qt,我有一个非常复杂的正则表达式,其中有一些捕获组 但是这个组在一个更大的组中,这个更大的组是可选的 下面是一个情况(我使用Qt和QRegularExpression,但我认为这并不重要): 现在我想换一根火柴 QString str = ".....some text...."; str.replace(regex, "\\1__\\3__\\5"); 现在有一个问题,因为3个捕获组是可选的,所以有时\\3不存在 如果其中一个捕获组不存在,我希望得到空字符串: 如果\\3存在,我想要: "\\1

我有一个非常复杂的正则表达式,其中有一些捕获组

但是这个组在一个更大的组中,这个更大的组是可选的

下面是一个情况(我使用Qt和QRegularExpression,但我认为这并不重要):

现在我想换一根火柴

QString str = ".....some text....";
str.replace(regex, "\\1__\\3__\\5");
现在有一个问题,因为3个捕获组是可选的,所以有时
\\3
不存在

如果其中一个捕获组不存在,我希望得到空字符串:

如果
\\3
存在,我想要:

"\\1__\\3__\\5"
"\\1____\\5"
但如果没有,我想:

"\\1__\\3__\\5"
"\\1____\\5"
如果它不存在,我会得到以下结果:

"...text...__\3__...text..."
很明显,我可以在两个或多个regexp/replace中完成这项工作,并在其间测试存在性

但是,是否有可能只进行一次更换?怎么做?最好的方法是什么

编辑

正如amartel告诉我的那样,根本没有问题,事实上我的错误是我试图访问第8个捕获,但只有7个,所以\\8返回我\8

我尝试了以下方法:

QRegExp rexp("(A)(?:([0-9]{2}) ([0-9]{2}) ([0-9]{2}))?(Z)");

QString s1("qA11 22 33Zq");
QString s2("wAZw");

s1.replace(rexp, "\\1__\\3__\\5");
s2.replace(rexp, "\\1__\\3__\\5");

qDebug() << s1;
qDebug() << s2;

您的问题可能在其他地方吗?

您的示例中的正则表达式不好,因为它匹配空字符串。我希望在real app中有所不同?另外,您使用的是非捕获语法-可能是问题吗?这只是一个示例,我真正的正则表达式非常复杂,我不认为在这里编写它有什么意义。如果你走近一点,你会发现没有抓捕的只是一个群体,而不是我想要抓捕的群体。这是可能的,我会寻找原因,让你知道你是对的,我真的感到羞愧。。。我必须将一个未捕获的计算为捕获。所以我最后一次抓捕不存在。谢谢你抽出时间。既然这个问题显然是个错误,我是否应该删除它?