使用括号时正则表达式不一致

时间:2017-05-25 00:23:29

标签: r regex

任何人都可以帮助我理解以下原因:

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

1 个答案:

答案 0 :(得分:4)

documentation开始,向前看向后看

  

是零长度断言;他们不消耗角色   string,但只断言是否可以匹配。

因此正则表达式(?=quick)(?=dog)将首先与(?=quick)匹配:

The quick brown fox jumps over the lazy dog
   ^^  # this position

由于它不消耗字符,因此位置在匹配后快速之前保持不变,并继续匹配失败的下一个模式(?=dog),因为这不是真的,实际上您永远不会找到quickdog;

后面的位置

如果其中一个模式是另一个模式的前缀,您会发现这有效,例如quickqui

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匹配。