Ruby正则表达式:^匹配行的开头,即使没有m修饰符?

Ruby 1.8.7。 我正在使用带有^的正则表达式来匹配字符串开头的模式。 问题是如果在字符串中的任何行的开头找到模式,它仍然匹配。 如果我使用’m’修饰符,这是我期望的行为,但我不是:

$ irb irb(main):001:0> str = "hello\ngoodbye" => "hello\ngoodbye" irb(main):002:0> puts str hello goodbye => nil irb(main):004:0> str =~ /^goodbye/ => 6 

我在这做错了什么?

  • 行的开头:^
  • 行结束:$
  • 字符串的开头:\ A.
  • 字符串的结尾:\ z

你的困惑是合理的。 在大多数正则表达式中, ^相当于\A$默认等效于\Z ,并且您必须设置“多行”标志以使它们具有其他含义(即行边界)。 在Ruby中, ^$ 总是在行边界匹配。

为了增加混淆,Ruby有一种称为“多线”模式的东西,但它实际上是其他所谓的“单线”或“DOTALL”模式:它改变了它的含义. 元字符,允许它匹配行分隔符(例如\r\n )以及所有其他字符。

“^”是该行的开头。 要制作你想要的东西,你可以拆分de string并测试第一行。 但我认为存在一些更好的方法。

 str.split("\n")[0] =~ /^hello/