r - 在 gregexpr 和 str_extract_all 函数中进行量化的交替

标签 r regex stringr

gregexprstr_extract_all 函数中进行量化

require(stringr)
gregexpr(pattern = "(h|a)*", "xxhx")
[[1]]
[1] 1 2 3 4
attr(,"match.length")
[1] 0 0 1 0
attr(,"useBytes")
[1] TRUE

str_extract_all(pattern = "(h|a)*", "xxhx")
[[1]]
[1] ""  ""  "h" ""  ""

为什么 gregexpr 表示 3 个空位而 str_extract_all 表示 4 个空位

最佳答案

这是 TRE (gregexpr) 和 ICU (str_extract_all) 正则表达式引擎处理空(也称为“零长度”)正则表达式匹配的区别。 TRE 正则表达式在零长度匹配后推进正则表达式索引,而 ICU 允许对同一位置进行两次测试。

如果您使用替换函数,两个引擎尝试的位置会变得很明显:

> gsub("(h|a)*", "-\\1", "xxhx")
[1] "-x-x-hx-"
> str_replace_all("xxhx", "(h|a)*", "-\\1")
[1] "-x-x-h-x-"

TRE 引擎匹配h 并将索引移动到x 之后,而ICU 引擎匹配h 并在h 之后立即停止x 之前的 code> 以匹配它之前的空位置。

关于r - 在 gregexpr 和 str_extract_all 函数中进行量化的交替,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49855329/

相关文章:

r - 字符串中格式错误的字符串

r - 在 Rmarkdown 中的 bash 中设置环境变量

r - 全局环境数据集汇总表

regex - 将缩写与字典匹配的最快方法

regex - 长字符串中的 FindAllStringSubmatch

r - 如何通过分隔符拆分 r 中的字符串并丢弃最后两项?

r - 如何反转单词?

r - 从旧的数据帧中产生一个新的数据帧?

r - smooth.Pspline stat_smooth 包装器(在 ggplot2 中)

javascript - 在字符串中搜索多个单词