好的,所以以下字符串是我的正则表达式将尝试匹配的内容:
[key1][key2][key3]
这是我的正则表达式。
\[(.+?)\]
这一切都在Qt中完成,这是我正在使用的代码
QRegExp reg("\\[(.+?)\\]");
reg.indexIn(string);
qDebug() << "Matches: " << reg.capturedTexts();
以上回复:
("", "")
那么有两个问题:
谢谢!
答案 0 :(得分:0)
首先,让我们优化您的正则表达式:使用.+?
代替[^\]]+
不情愿的表达式,这样可以避免所谓的catastrophic backtracking。新表达式如下:
\\[([^\\]]+)\\]
在我的正则表达式上,为什么我需要将
\\
用于它?
因为正则表达式通过两个注意反斜杠的编译器 - 首先是你的C ++编译器,然后是QRegExp
构造函数中的正则表达式编译器。该对的第一个斜杠是C ++编译器;第二个用于正则表达式编译器。一旦C ++编译器完成,每对backslahses都会被一个斜杠替换,这正是正则表达式所需要的。
我得到了
key1
,但现在如何获得另外2个?reg.capturedCount()
返回1
您的正则表达式一次捕获一个方括号 - 分隔项。如果你想全部捕获它们,你需要一个循环:
int pos = 0;
while (pos >= 0) {
pos = reg.indexIn(str, pos);
if (pos >= 0) {
++pos; // move along in str
qDebug() << "Matches: " << reg.capturedTexts();
}
}