2013-03-28 65 views
1

我有,我有一些捕获组可选捕获组

一个相当复杂的正则表达式,但这个群体是在一个更大的群体,而这个更大的群体是可选

这里的情况看(我使用Qt是什么,以及QRegularExpression,但我相信它并不重要):

QRegularExpression regex("(.*)(?:([0-9]{2}) ([0-9]{2}) ([0-9]{2}))?(.*)"); 

现在我想更换比赛

QString str = ".....some text...."; 
str.replace(regex, "\\1__\\3__\\5"); 

现在有一个问题,因为由于3个捕获组是可选的,有时\\3不存在。

我要的是让空字符串,如果捕获组不存在:

如果\\3存在,我想:

"\\1__\\3__\\5" 

,但如果没有,我想:

"\\1____\\5" 

这里,如果它不存在,我得到什么:

"...text...__\3__...text..." 

我明显可以做到两个或更多的正则表达式/替换,并在

之间测试存在

但是有可能只做一个替换吗?如何 ?做这件事的最好方法是什么?

编辑

由于amartel告诉我,没有一点问题都没有,其实我的错误是,我试图访问第8捕获,但只有7,所以\\ 8回我\ 8

+0

你的例子中的正则表达式不好,因为它匹配空字符串。我希望在真正的应用程序是不同的?此外,您正在使用非捕获语法 - 可能是问题吗? – Amartel 2013-03-28 10:17:20

+0

这只是一个例子,我真正的正则表达式非常复杂,我没有看到写在这里的意义。如果你仔细观察,你会发现非捕获仅在一个组上,而不是我想捕获的那些 – BlueMagma 2013-03-28 10:20:30

回答

2

我尝试这样做:

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; 

输出功率为:

"qA__22__Zq" 
"wA____Zw" 

您的问题在别的地方?

+0

这是可能的,我将搜索原因并让我知道 – BlueMagma 2013-03-28 10:42:51

+0

你是对的,我感到非常羞愧。 ..我必须指望一个非捕获作为一个捕获。所以我最后的捕获并不存在。 谢谢你的时间。 由于问题显然是一个错误,我应该删除它吗? – BlueMagma 2013-03-28 10:46:36