2017-05-25 18 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