2017-05-25 16 views
1

谁能可能会帮助我了解为什么以下:正则表达式不一致使用括号

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 
+2

像'(?= quick)'这样的前瞻物在紧挨着前瞻物的内容之前匹配。 '(?= quick)'匹配的点在它之后不会有'dog'。你想要你的正则表达式是什么意思? – Marius

+0

你的第四个正则表达式就是你想要逻辑断言'dog'出现在'quick'之后的任何地方。 –

+0

''(?= quick)(?=。* dog)''=''(?= quick。* dog)'' –

回答

4

documentation向前看看后面

是零长度断言;它们不消耗 字符串中的字符,但仅声明是否可以匹配。

所以正则表达式(?=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

+0

感谢Psidom。我试图实现一个AND语句,所以这个工作。 – geotheory