有人可以解释一下:
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
序列的特殊规则吗? $
上的文档只是说它会匹配“行尾”,但不能解释这种行为。
答案 0 :(得分:4)
$
是一个零宽度断言。它与任何字符都不匹配,它匹配位置。也就是说,它在\n
之前或在字符串结尾处匹配。
/hi there\s*$/
匹配,因为\s*
匹配"\r\n\r"
,这允许$
在第二个\n
之前的位置匹配。 $
也可以在第一个\n
之前的位置匹配,但\s*
是贪婪的,尽可能匹配,同时仍允许整体正则表达式匹配。