谁能解释一下:
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
序列这里有什么特殊规则吗? $
上的文档只是说它将匹配“行尾”,这并没有解释这种行为。
最佳答案
$
是一个零宽度断言。它不匹配任何字符,它匹配一个位置。即,它匹配 \n
之前或字符串末尾。
/hi there\s*$/
匹配,因为 \s*
匹配 "\r\n\r"
,这允许$
匹配第二个\n
之前的位置。 $
也可以在第一个 \n
之前的位置匹配,但是 \s*
是贪婪的并且尽可能多地匹配,同时仍然允许整个正则表达式匹配。
关于ruby - 为什么 $ 不匹配\r\n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22004868/