Grep -P模式下{,N}至多匹配失效的问题咨询
为什么grep -P中{,N}正则语法未按预期匹配数字?
问题场景
需要从文本中提取以chr开头,后跟至多2位数字或单个X/Y,再跟下划线的行。输入示例:
chr5_ 16560869 chrX 46042911 chr12_ 131428407 chr22_ 13191864 chr5 165608 chrX_ 96055593
执行以下命令时,仅能匹配到chrX_/chrY_开头的行,无法匹配chr5_/chr12_这类行:
grep -P "^chr(\d{,2}|X{1}|Y{1})_" input_file.txt
但将{,2}改为{1,2}后,命令能得到预期结果:
grep -P "^chr(\d{1,2}|X{1}|Y{1})_" input_file.txt
原因解析
问题出在GNU grep的PCRE模式(-P)对{,N}简写语法的兼容性:
- 虽然Perl正则规范本身支持
{,N}表示「0到N次匹配」,但部分旧版本的GNU grep在-P模式下,无法正确识别这种简写形式,会导致\d{,2}分支失效,正则只能匹配后面的X/Y分支。 - 而
{1,2}是所有PCRE实现都支持的标准语法,表示「1到2次匹配」,因此分支能正常工作,匹配到1-2位数字的情况。
补充说明
你的需求中,chr后面必须跟至少1位数字或单个X/Y,因此\d{1,2}才是符合需求的写法({,2}允许0位数字,本身就不符合你的提取逻辑)。如果确实需要「0到N次」的语义,在旧版grep中需显式写成{0,N}(比如\d{0,2})才能被正确解析。
内容的提问来源于stack exchange,提问作者ricardlambea
相关产品推荐
相关产品推荐

