gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:43 26 4
gpt4 key购买 nike

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

  • 以给定前缀开头的文本(假设它是 ab4)
  • 文本有 4 个字符的 4 个 block (这就是 ab4 中的 4 代表的意思)每个字符都可以是 ASCII 字母数字、空格、括号、连字符或点(基本上是 a-zA-Z0-9 ()-.)。示例:abcd.b ab(a.) 都是有效的单 block 。
  • 正文可以为空(ab4 是唯一的内容)或最多包含四个 block (ab4xxxxab4xxxxxxxxab4xxxxxxxxxxxx, ab4xxxxxxxxxxxxxxxx 其中 x 为有效字符)
  • 文本以 CR 结尾(回车 - \r\n)。结尾算作终止字符,不是正文的一部分

到目前为止我想出了

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

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

ab4aaa bbb ccc ddd \r\n 

我得到以下统计数据:

  • 完整匹配:

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

  • 第 1 组:

    15-19 'ddd'

正则表达式验证器告诉我

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 个街区分开作为单独的组。对于上面的示例,我期待

  • 完整匹配:

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

    • 第 1 组:

    0-3 'aaa'

    • 第 1 组:

    4-7 'bbb'

    • 第 3 组:

    8-11 'ccc'

    • 第 4 组:

    12-15 'ddd'

最佳答案

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

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

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

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

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

使用模式来extract all matches来自文本。

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

关于c++ - 如何将正则表达式中的组的每次迭代作为一个单独的组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47153147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com