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

时间:2017-11-07 08:26:49

标签: c++ regex qregularexpression

对于以下问题,我很难找出正则表达式(我很遗憾几乎没有遇到过):

  • 以给定前缀开头的文字(让我们说出ab4
  • text包含4个4个字符的正文(4ab4代表的内容),每个字符可以是ASCII字母数字,空格,括号,连字符或点(基本上是a-zA-Z0-9 ()-.)。示例:abcd.b ab(a.)都是有效的单个区块。
  • 文本正文可以为空(ab4是唯一的内容)或最多包含四个块(ab4xxxxab4xxxxxxxxab4xxxxxxxxxxxxab4xxxxxxxxxxxxxxxx x是有效的角色)
  • 文本以CR结尾(回车 - \r\n)。结尾被视为终止字符,不是正文的一部分

到目前为止,我已经提出了

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

在将其添加到我的C ++代码之前,我使用regular expressions 101来验证我的正则表达式。但是,如果我输入

ab4aaa bbb ccc ddd \r\n 

我得到以下统计数据:

  • 完全匹配:

    0-25 'ab4aaa bbb ccc ddd \r\n'

  • 第1组。

    15-19 'ddd '

正则表达式验证程序告诉我

  

重复捕获组仅捕获最后一次迭代。放一个   捕获重复组周围的组以捕获所有迭代或   如果您对数据不感兴趣,请使用非捕获组

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

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

  • 完全匹配:

    0-25 'ab4aaa bbb ccc ddd \r\n'

    • 第1组。

    0-3 'aaa '

    • 第1组。

    4-7 'bbb '

    • 第3组。

    8-11 'ccc '

    • 第4组:

    12-15 'ddd '

1 个答案:

答案 0 :(得分:2)

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

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

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

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

注意我在您感兴趣的部分周围添加了捕获括号,并且连字符位于字符类的末尾。

使用文本中的extract all matches模式。

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