R语言中{stringr}与{pointblank}包下正则表达式量词逗号({min,max})与短横线({min-max})的表现差异及反常问题
问题分析:正则量词写法 vs pointblank包的异常表现
首先明确正则表达式的标准语法:区间量词必须用逗号分隔,也就是{min,max}的格式,用短横线{min-max}是完全错误的写法——这种格式在标准正则引擎(包括stringr依赖的ICU引擎)里会被判定为无效的区间语法,所以stringr::str_detect()报错是完全符合预期的。
接下来我们拆解你遇到的两种情况:
示例1:符合预期的表现
- 正确的
pattern_comma = "^\\\\d{1,3}$"(实际正则为^\d{1,3}$):匹配1-3位数字,所以stringr和pointblank都能正常匹配df1中的值,这没问题。 - 错误的
pattern_dash = "^\\\\d{1-3}$"(实际正则为^\d{1-3}$):正则引擎会把{1-3}当成字面量字符序列,也就是要求字符串是「一个数字 +{1-3}」,而df1里的"123"、"68"都不符合这个规则,所以pointblank验证失败,这也符合预期。
示例2:反常的表现——pointblank的疑似bug
这里的情况完全不符合正则语法逻辑:
- 正确的
doi_pattern_comma = "^10\\\\.\\\\d{4,9}/[-.;()/:\\\\w\\\\d]+$"(实际正则为^10\.\d{4,9}/[-.;()/:\w\d]+$):这个正则应该匹配10.后接4-9位数字,再跟后续的DOI路径,df2里的两个DOI都满足这个规则(1186、1002都是4位数字),但pointblank::col_vals_regex()却验证失败,这是反常的。 - 错误的
doi_pattern_dash = "^10\\\\.\\\\d{4-9}/[-.;()/:\\\\w\\\\d]+$"(实际正则为^10\.\d{4-9}/[-.;()/:\w\d]+$):这个正则要求10.后接一个数字,再跟字面量{4-9},然后才是/和后续路径——但df2里的DOI是10.1186/...和10.1002/...,根本不存在{4-9}这个字符序列,理论上完全不匹配,但pointblank却验证通过了,这明显违背了正则的基本逻辑。
结论
- 正则写法的问题:你一开始的认知是对的,
{min,max}是唯一正确的区间量词格式,{min-max}是错误写法,stringr的表现完全正常。 - pointblank包的疑似bug:示例2中的反常表现几乎可以确定是
col_vals_regex()函数在正则解析或引擎调用上存在问题,建议你把完整的reprex代码提交到pointblank的GitHub仓库的issue区,帮助开发者定位问题。
内容的提问来源于stack exchange,提问作者maia-sh
相关产品推荐
相关产品推荐

