Alternaion与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 regex在零长度匹配之后使regex索引前进,而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之前以匹配之前的空位置。

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

10-08 20:41