在gregexpr和str_extract_all函数中使用量化的Alternaion

时间:2018-04-16 10:41:42

标签: r regex stringr

gregexprstr_extract_all函数

中进行量化的Alternaion
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个空洞

1 个答案:

答案 0 :(得分:4)

这是TRE(gregexpr)和ICU(str_extract_all)正则表达式引擎如何处理空(也称为#34;零长度")正则表达式匹配之间的区别。 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之前停止以匹配空在它之前的位置。