【问题标题】:Base R Equivalent of `stringr::str_extract_all` [duplicate]`stringr::str_extract_all`的基本R等价物[重复]
【发布时间】:2026-02-07 13:15:01
【问题描述】:

如何从基础 R 中的 {stringr} 包中实现 str_extract_all 函数?我找到了一种基于this answer 实现str_extract 的方法:

str_extract <- function(string, pattern) {
  regmatches(string, regexpr(pattern, string))
}

但是,这只会返回string 中的first 匹配模式,例如

pattern <- "xx|xx\\."
str_extract("xx (xx.)", pattern)
[1] "xx"

stringr::str_extract_all 会返回

[1] "xx" "xx."

这就是我所追求的。

【问题讨论】:

  • 使用 gregexpr 代替 regexpr。

标签: r regex string


【解决方案1】:

regexpr() 更改为gregexpr() 即可:

str_extract <- function(string, pattern) {
  regmatches(string, gregexpr(pattern, string))
}

pattern <- "xx|xx\\."
str_extract("xx (xx.)", pattern)

输出:

[[1]]
[1] "xx"  "xx."

R 的文档非常简单地介绍了 regexprgregexpr 函数:

regexpr 返回一个与给出的文本长度相同的整数向量 第一个匹配的起始位置,如果没有,则为 -1,使用 属性“match.length”,一个整数向量,给出的长度 匹配的文本(或 -1 表示不匹配)。

gregexpr 返回一个与 text 的每个元素长度相同的列表 它与正则表达式的返回值形式相同,除了 给出了每个(不相交的)匹配的起始位置。

【讨论】: