如何将正则表达式中的组的每次迭代作为一个单独的组?
How to get every iteration of a group in a regex as a separate group?
我很难为以下问题找出正则表达式(遗憾的是我几乎没有经验):
- 以给定前缀开头的文本(假设它是
ab4
)
- 文本有 4 个字符的 4 块正文(这就是
ab4
中的 4
代表的内容)每个字符都可以是 ASCII 字母数字、空格、括号、连字符或一个点(基本上是 a-zA-Z0-9 ()-.
)。示例:abcd
、.b a
、
、b(a.)
都是有效的单块。
- 正文可以为空(
ab4
是唯一的内容)或最多包含四个块(ab4xxxx
、ab4xxxxxxxx
、ab4xxxxxxxxxxxx
、ab4xxxxxxxxxxxxxxxx
其中 x
是一个有效字符)
- 文本以 CR 结尾(回车 return -
\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
^ ^ ^
请注意,我在您感兴趣的部分周围添加了捕获括号,连字符位于字符 class.
的末尾
使用文本中的模式 extract all matches。
然后将match.captured(1)
拆分为substrings of length 4。您实际上不需要为此步骤使用正则表达式,因为字符串已经在第一个正则表达式步骤中进行了预验证。
我很难为以下问题找出正则表达式(遗憾的是我几乎没有经验):
- 以给定前缀开头的文本(假设它是
ab4
) - 文本有 4 个字符的 4 块正文(这就是
ab4
中的4
代表的内容)每个字符都可以是 ASCII 字母数字、空格、括号、连字符或一个点(基本上是a-zA-Z0-9 ()-.
)。示例:abcd
、.b a
、、
b(a.)
都是有效的单块。 - 正文可以为空(
ab4
是唯一的内容)或最多包含四个块(ab4xxxx
、ab4xxxxxxxx
、ab4xxxxxxxxxxxx
、ab4xxxxxxxxxxxxxxxx
其中x
是一个有效字符) - 文本以 CR 结尾(回车 return -
\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
^ ^ ^
请注意,我在您感兴趣的部分周围添加了捕获括号,连字符位于字符 class.
的末尾使用文本中的模式 extract all matches。
然后将match.captured(1)
拆分为substrings of length 4。您实际上不需要为此步骤使用正则表达式,因为字符串已经在第一个正则表达式步骤中进行了预验证。