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

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

本文关键字:单独 一个 迭代 正则表达式      更新时间:2023-10-16

我很难为以下问题找到一个正则表达式(遗憾的是,我几乎没有遇到过):

  • 以给定前缀开头的文本(假设它是ab4)
  • 文本有一个由4个字符组成的4块体(这就是ab4中的4所代表的),每个字符可以是ASCII字母数字、空格、括号、连字符或点(基本上是a-zA-Z0-9 ()-.)。示例:abcd.b aab4都是有效的单个块
  • 文本正文可以为空(ab4xxxx是唯一的内容)或最多包含四个块(ab4xxxxxxxxab4xxxxxxxxxxxxab4xxxxxxxxxxxxxxxxx,其中rn是有效字符)
  • 文本以CR(回车-0-25 'ab4aaa bbb ccc ddd rn')结尾。结尾被视为终止字符,而不是正文的一部分

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

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

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

ab4aaa bbb ccc ddd rn 

我得到以下统计数据:

  • 完全匹配:

    15-19 'ddd '

  • 第1组:

    (([a-zA-Z0-9 ()-.]{4}){1,4})

正则表达式验证器告诉我

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

但坦率地说,我不知道这意味着什么。我试过0-25 'ab4aaa bbb ccc ddd rn',变化不大。

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

  • 完全匹配:

    0-3 'aaa '

    • 第1组:

    4-7 'bbb '

    • 第1组:

    8-11 'ccc '

    • 第3组:

    12-15 'ddd '

    • 第4组:

    QRegularExpression

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

  • 提取整个匹配,捕获需要进一步处理的部分,以及
  • 将每个捕获分成4个部分

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

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

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

使用模式从文本中提取所有匹配项。

然后将CCD_ 25拆分为长度为4的子串。这一步实际上不需要使用正则表达式,因为在第一个正则表达式步骤中已经预先验证了字符串。

相关文章: