Ruby正则:如何重复捕获相同捕获组以提取多属性信息
正则表达式捕获解决方案
场景与需求
认证系统中有如下格式字符串:
STRING = CR*reduced*downsized*U*reduced*D*own_only
需要实现:
- 提取每个大写字母(如CRUD)作为捕获组1
- 提取大写字母紧随的星号包裹属性:
- 对C、U、D这类字母,仅需捕获单个属性(或空值)
- 对字母R,需同时捕获
reduced和downsized两个属性,分别作为捕获组2和捕获组3
现有正则仅能处理单属性场景,无法适配R的多属性捕获需求。
解决方案正则
统一捕获组格式的正则
([A-Z])(?:\*([a-z_]+)(?:\*([a-z_]+))?)?
匹配逻辑说明
- 捕获组1:始终匹配单个大写字母(C/R/U/D等)
- 捕获组2:匹配大写字母后第一个星号包裹的属性(R对应
reduced,U对应reduced,D对应own_only,C为空) - 捕获组3:仅当大写字母是R时,匹配第二个星号包裹的属性
downsized,其他场景为空
针对R单独分支的正则(可选)
如果需要明确区分R和其他字母的匹配逻辑,也可以用分支结构:
(R)\*([a-z_]+)\*([a-z_]+)|([A-Z])\*?([a-z_]+)?\*?
- 第一个分支专门匹配R的多属性场景:捕获组1=R,捕获组2=reduced,捕获组3=downsized
- 第二个分支匹配其他字母的单属性/空属性场景:捕获组4=对应大写字母,捕获组5=对应属性(或空)
测试验证
针对目标字符串各部分的匹配结果:
C→ 捕获组1:C,捕获组2: 空,捕获组3: 空R*reduced*downsized→ 捕获组1:R,捕获组2:reduced,捕获组3:downsizedU*reduced→ 捕获组1:U,捕获组2:reduced,捕获组3: 空D*own_only→ 捕获组1:D,捕获组2:own_only,捕获组3: 空
内容的提问来源于stack exchange,提问作者fydelio
相关产品推荐
相关产品推荐

