ruby - 为什么 $ 不匹配\r\n

标签 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 序列这里有什么特殊规则吗? $ 上的文档只是说它将匹配“行尾”,这并没有解释这种行为。

最佳答案

$ 是一个零宽度断言。它不匹配任何字符,它匹配一个位置。即,它匹配 \n 之前或字符串末尾。

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

关于ruby - 为什么 $ 不匹配\r\n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22004868/

相关文章:

python - 研究 "TypeError: expected string or bytes-like object"

regex - 使用 perl 拆分空格

php - 将 **Foo** 替换为 <strong>Foo</stong> (正则表达式)?

Javascript Regex - 伪造后视的意外行为

正则表达式匹配 TR3456789、ME3456789 或 123456789

ruby - Smalltalk 中的单一职责

ruby-on-rails - Rails 子查询总是返回 nil 值

ruby - gem install bson 在 Windows 10 上失败

ruby - 在 Ruby 中有 "repackage"关键字参数的好方法吗?

ruby - ruby、sinatra 和 haml 中的联系表单