You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:48:22