2010-08-16 165 views
1

確定我得到從正則表達式食譜這個例子先行混亂

^(?=.{3}$).* 

正則表達式以上是使用限制的任意圖案

的長度如果我再次「AAABBB」測試,它完全失敗

從我的理解它尋找一個任意字符3 length.SO之前應該符合「BBB」,但它不是

一個問題,壽任何字符ld lookbehind遵循這種模式x(?= x)

+0

你所使用的先行斷言,因爲它看起來在那個還沒有消耗字符。後顧斷言會查看已經消耗的字符。 – Gumbo 2010-08-16 18:22:33

+0

但是你究竟想要完成什麼? – Gumbo 2010-08-16 18:22:55

+0

編輯:限制任意模式的長度 – slier 2010-08-16 18:27:40

回答

5

這實際上是一個前瞻斷言而不是後置斷言。 ^在字符串的起始處錨定匹配,然後聲明字符串的開頭必須跟着3個字符,後面跟着字符串的結尾。

編輯:我應該可能已經提到,*末尾用於匹配這三個字符,因爲前瞻斷言不會消耗任何字符。

+0

你的意思是不消耗任何字符? – slier 2010-08-16 18:35:12

+0

我的意思是,在完成lookahead斷言之後,正則表達式引擎繼續比較它進入lookahead的點的字符串。所以給定模式'^(?= foo)(。*)$'和輸入'foobar'由捕獲組1捕獲的值將是'foobar'。該模式將首先執行向前看,即檢查字符串的開始是否爲foo,然後它將移到'。*'上,因爲lookahead不消耗任何字符,這意味着與。*匹配的第一個字母是然後等到它捕捉到'foobar' – 2010-08-16 18:43:34

4

從我的理解是尋找那些在length.SO任何字符3之前,應該符合「BBB」,但它不是

都能跟得上任何字符!讓我們來仔細看看...

^  # The caret is an anchor which denotes "STARTS WITH" 
(?=  # lookahead 
    .  # wildcard match; the . matches any non-new-line character 
    {3} # quantifier; exactly 3 times 
    $  # dollar sign; I'm not sure if it will act as an anchor but if it did it would mean "THE END" 
)  # end of lookbehind 
.  # wildcard match; the . matches any non-new-line character 
*  # quantifier; any number of times, including 0 times 

幾個問題:

  1. 插入符號要求.*是字符串中的第一個字符,然後你想回顧後他們之間sandwhiched字符開始^和第一個字符.*
  2. .{3}實際上意味着任何三個字符,任何字符重複三次;)你真的想知道How can I find repeated letters with a Perl regex?