任何人都可以帮助我理解以下原因:
require(stringr)
x = "The quick brown fox jumps over the lazy dog"
str_detect(x, 'dog')
#> [1] TRUE
str_detect(x, '(?=dog)')
#> [1] TRUE
str_detect(x, '(?=quick)(?=dog)') # fails why?
#> [1] FALSE
str_detect(x, '(?=quick)(?=.*dog)')
#> [1] TRUE
答案 0 :(得分:4)
从documentation开始,向前看,向后看:
是零长度断言;他们不消耗角色 string,但只断言是否可以匹配。
因此正则表达式(?=quick)(?=dog)
将首先与(?=quick)
匹配:
The quick brown fox jumps over the lazy dog
^^ # this position
由于它不消耗字符,因此位置在匹配后快速之前保持不变,并继续匹配失败的下一个模式(?=dog)
,因为这不是真的,实际上您永远不会找到quick
和dog
;
如果其中一个模式是另一个模式的前缀,您会发现这有效,例如quick
和qui
:
x = "The quick brown fox jumps over the lazy dog"
str_detect(x, '(?=quick)(?=qui)')
# [1] TRUE
另一方面, (?=quick)(?=.*dog)
在匹配(?=.*dog)
之后尝试在该位置找到(?=quick)
:
The quick brown fox jumps over the lazy dog
^^ # this position
TRUE
以后的quick brown fox jumps over the lazy dog
可以与.*dog
匹配。