2014-02-25 50 views
1

有人能解釋這一點:

str = "hi there\r\n\r\nfoo bar" 

rgx = /hi there$/ 
str.match rgx # => nil 

rgx = /hi there\s*$/ 
str.match rgx # => #<MatchData "hi there\r\n\r"> 

一方面,它似乎像$不匹配\r。但是如果我先捕獲所有的空格,其中包括\r,那麼$突然確實看起來與第二個\r匹配,而不是繼續捕獲尾隨的"\nfoo bar"

這裏有關於連續\r\n序列的一些特殊規則嗎? $上的文檔簡單地說它將匹配「行尾」,這不能解釋這種行爲。

回答

4

$是一個零寬度斷言。它不匹配任何字符,它匹配位置。也就是說,它可以在\n之前立即匹配,也可以在字符串末尾匹配。

/hi there\s*$/比賽因爲\s*匹配"\r\n\r",這允許$到第二\n之前在該位置相匹配。 $也可能在第一個\n之前的位置匹配,但\s*是貪婪的並且匹配儘可能多,同時仍然允許整體正則表達式匹配。

+0

底線問題:\ r不與$匹配,也不是「\ r \ n」,即使放入和其他東西確實將它們理解爲換行符以用於顯示。 – eagspoo