如何获取字符串中重叠匹配模式的所有起始索引?
解决R中字符串重叠匹配的索引问题
我完全懂你的困惑!你想要找到所有重叠匹配的起始索引,但gregexpr和str_locate_all默认是做非重叠匹配的——也就是说,当它们在位置1匹配到"11"后,会直接跳过位置2,从位置3开始继续查找,这就是为什么你看不到索引2的原因。
下面是两种能正确获取所有重叠匹配起始索引的方法:
方法1:使用gregexpr结合正向预查
通过Perl风格的正则表达式中的正向预查(positive lookahead),我们可以实现不消耗字符的匹配,这样就能捕获到所有可能的起始位置:
x <- "1110001101" # 使用(?=11)作为匹配模式,开启perl参数 match_positions <- gregexpr(pattern = "(?=11)", x, perl = TRUE) # 提取匹配的起始索引 as.integer(match_positions[[1]])
运行结果:
[1] 1 2 7
解释:(?=11)是零宽度断言,它只会检查当前位置后面是否跟着"11",但不会移动匹配指针,所以匹配完位置1后,会继续检查位置2,而不是跳转到位置3。
方法2:使用stringr包的str_locate_all
同样利用正向预查的思路,在stringr中也能实现:
library(stringr) x <- "1110001101" # 用正向预查模式匹配 matches <- str_locate_all(x, "(?=11)") # 提取起始索引列 as.integer(matches[[1]][, "start"])
运行结果同样是:
[1] 1 2 7
简单总结一下:默认的正则匹配是"贪婪且非重叠"的,如果你需要捕获重叠的匹配结果,就需要用到零宽度断言这类特殊的正则语法,让函数逐个检查每个可能的起始位置,而不会跳过已匹配的字符。
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

