Alternaion与gregexpr
和str_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/