如何将正则表达式中组的每次迭代都作为一个单独的组
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
、、
ab4
都是有效的单个块 - 文本正文可以为空(
ab4xxxx
是唯一的内容)或最多包含四个块(ab4xxxxxxxx
、ab4xxxxxxxxxxxx
、ab4xxxxxxxxxxxxxxxx
、x
,其中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的子串。这一步实际上不需要使用正则表达式,因为在第一个正则表达式步骤中已经预先验证了字符串。
相关文章:
- 我应该有 2 个单独的班级,一个用于"logic",一个用于"graphic interface"?
- 查询事件日志.如何查询才能单独获取第一个和最后一个事件?
- window.display() 单独在显示的最后一个缓冲区和当前缓冲区之间切换
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 将一个随机的字符序列和int序列解析为单独的向量
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 显示数组的问题.一切都放在一个单独的行中,但不放入单独的列中
- 我如何构建一个从git克隆的单独的增强库
- 如何将一个类的两个单独实例设置为彼此相等的 c++
- 如何在单独的线程上加载纹理到主内存并使用它在另一个线程上渲染
- 如何在这个交换函数(一个单独的链表)中找到错误
- 如何将正则表达式中组的每次迭代都作为一个单独的组
- 如何避免将两个单独的'>'格式化为一个班次?
- 如何从一个函数中获取2个单独的输出
- C#优雅地关闭一个没有UI的单独应用程序
- 如何将我的C++DLL包含在一个单独的项目中
- 哪个更好,一个类中的类或完全在单独的类中
- 将单独的数字转换为一个整数C++
- 如果我在C++中分配一个带有运算符 new[] 的对象数组,但单独释放它们是否仍然构成内存泄漏
- 为什么 setprecision( ) 在一个数字中给我两个单独的小数点