R中gregexpr无法识别重叠匹配?求检测所有重叠模式的函数
在R中识别所有重叠模式的起始位置
要解决重叠模式的匹配问题,你可以通过以下两种方式实现:
1. 使用base R的gregexpr结合正向预查正则
通过正向零宽度预查((?=模式))的正则语法,让匹配不消耗字符串字符,从而捕获所有重叠的起始位置。需要开启perl = TRUE来支持Perl风格正则:
# 匹配所有重叠的起始位置 matches <- gregexpr("(?=us_ca_us)", "_xx_us_ca_us_ca_us_yy_", perl = TRUE) matches[[1]] # 输出:[1] 5 11
这里的正向预查仅定位模式的起始位置,不占用字符,因此能识别到重叠的匹配项。
2. 使用stringr包的str_locate_all
stringr包的str_locate_all函数同样支持正向预查,代码更简洁:
library(stringr) # 获取所有匹配的起始位置 start_positions <- str_locate_all("_xx_us_ca_us_ca_us_yy_", "(?=us_ca_us)")[[1]][, 1] start_positions # 输出:[1] 5 11
原理说明
默认的gregexpr(未开启perl = TRUE)采用非重叠匹配,找到第一个匹配后会跳过已匹配的字符,因此无法识别重叠项。而正向零宽度预查是一种"环视"语法,仅检查当前位置后是否存在目标模式,不会移动匹配指针,因此能捕获所有重叠的起始位置。
内容的提问来源于stack exchange,提问作者user30393479
相关产品推荐
相关产品推荐

