正则表达式如何在捕获组匹配时排除指定固定后缀内容
正则捕获组匹配时自动剔除冗余片段的实现方法
待匹配原始内容
Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=aa-environment.topic-ok, patternType=LITERAL)`: Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=bb-environment.topic-deleted - marked for deletion, patternType=LITERAL)`:
原有正则存在的问题
原先使用的正则表达式:
^Current ACLs for resource \`ResourcePattern\(resourceType=(\w+), name=(\S+), patternType=(\w+)\)\`
该正则name字段捕获组使用\S+贪婪匹配所有非空白字符,会将第二条记录携带的 - marked for deletion后缀一并捕获到Group2中,无法得到纯净的topic名称。
修正后的正则
^Current ACLs for resource \`ResourcePattern\(resourceType=(\w+), name=(\S+?)(?: - marked for deletion)?, patternType=(\w+)\)\`
改动逻辑说明
- 将name捕获组的
\S+替换为\S+?,采用非贪婪模式匹配非空白字符,匹配到后续终止标识就立刻停止 - 新增非捕获组
(?: - marked for deletion)?,匹配0次或1次固定的删除标记后缀,该部分内容不会被纳入捕获结果,实现自动剔除效果 - 保留name字段后的逗号作为匹配锚点,无论条目是否携带删除后缀,都会在字段分隔的逗号位置终止name字段的匹配
最终捕获结果
两个条目的Group2捕获值完全符合预期:
aa-environment.topic-okbb-environment.topic-deleted
该方案不需要额外对捕获结果做后置字符串处理,正则匹配阶段就可以直接得到目标值。
内容的提问来源于stack exchange,提问作者Fredrik Lysén
相关产品推荐
相关产品推荐

