为什么$不匹配\ r \ n

时间:2014-02-25 04:49:28

标签: ruby regex

有人可以解释一下:

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序列的特殊规则吗? $上的文档只是说它会匹配“行尾”,但不能解释这种行为。

1 个答案:

答案 0 :(得分:4)

$是一个零宽度断言。它与任何字符都不匹配,它匹配位置。也就是说,它在\n之前或在字符串结尾处匹配。

/hi there\s*$/匹配,因为\s*匹配"\r\n\r",这允许$在第二个\n之前的位置匹配。 $也可以在第一个\n之前的位置匹配,但\s*是贪婪的,尽可能匹配,同时仍允许整体正则表达式匹配。