如何将正则表达式中的组的每次迭代作为一个单独的组?

How to get every iteration of a group in a regex as a separate group?

我很难为以下问题找出正则表达式(遗憾的是我几乎没有经验):

到目前为止我想出了

.*ab4([a-zA-Z0-9 ()-.]{4}){1,4}\r\n.*

我使用 regular expressions 101 来验证我的正则表达式,然后再将它添加到我的 C++ 代码中。但是,如果我输入

ab4aaa bbb ccc ddd \r\n 

我得到以下统计数据:

正则表达式验证器告诉我

A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data

但坦率地说,我不知道这意味着什么。我尝试了 (([a-zA-Z0-9 ()-.]{4}){1,4}) 并没有太大变化。

我正在寻找更好的分组,即将 4 个街区设置为单独的组。对于上面的示例,我期待

您使用的 PCRE 正则表达式引擎(QRegularExpression)不支持每个组的捕获堆栈,因此您将不得不使用两步法:

  • 提取整个匹配项以捕获您需要进一步处理的部分,并且
  • 将每个捕获拆分为 4 个字符的部分。

第一个提取的正则表达式将是

ab4((?:[a-zA-Z0-9 ().-]{4}){1,4})\r\n
   ^                 ^          ^

请注意,我在您感兴趣的部分周围添加了捕获括号,连字符位于字符 class.

的末尾

使用文本中的模式 extract all matches

然后将match.captured(1)拆分为substrings of length 4。您实际上不需要为此步骤使用正则表达式,因为字符串已经在第一个正则表达式步骤中进行了预验证。