Qt Regex帮助(数组键)

时间:2015-02-17 16:26:44

标签: c++ regex qt qt-creator

好的,所以以下字符串是我的正则表达式将尝试匹配的内容:

[key1][key2][key3]

这是我的正则表达式。

\[(.+?)\]

这一切都在Qt中完成,这是我正在使用的代码

QRegExp reg("\\[(.+?)\\]");
reg.indexIn(string);
qDebug() << "Matches: " << reg.capturedTexts();

以上回复:

("", "")

那么有两个问题:

  1. 为什么捕获空白
  2. 关于我的正则表达式,为什么我需要将\\让它工作?如果我只是放\它不会捕获任何东西。
  3. 谢谢!

1 个答案:

答案 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();
     }
}