C语言POSIX ERE正则:如何在可选组存在时停止匹配?
POSIX ERE正则分组捕获修正方案
你的定向比较_链接Back支持用想到RM把� 正则([[:alnum:] ]+) (A)? ?([[:digit:]]{4})出现分组错位,核心原因是[[:alnum:] ]+的贪婪匹配特性——它会尽可能多匹配字符(包括空格和"A"),直到后续模式能匹配为止。加上POSIX ERE不支持非捕获组(?:...)和非贪婪量词(+?/*?`),需要改用分支匹配的思路解决。
正确正则表达式
使用分支结构覆盖两种输入场景(含token2和不含token2),同时锚定整个字符串避免部分匹配:
^([[:alnum:] ]+) (A) ([[:digit:]]{4})$|^([[:alnum:] ]+) ([[:digit:]]{4})$
分组匹配规则
- 当输入包含"A"(如
R2D2 A 2250),匹配第一个分支:
组1 = token1(R2D2),组2 = token2(A),组3 = token3(2250) - 当输入不含"A"(如
R2D2 2250),匹配第二个分支:
组4 = token1(R2D2),组5 = token3(2250)
C语言代码处理逻辑
匹配后通过regmatch_t数组判断分组有效性:
- 检查
pmatch[2].rm_so是否不等于-1(组2有内容),若是则直接取组1、组2、组3的内容; - 若组2无内容,则取组4、组5的内容作为token1和token3,token2设为空字符串。
内容的提问来源于stack exchange,提问作者geohei
相关产品推荐
相关产品推荐

