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

时间:2010-11-23 14:36:54

标签: ruby regex

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

我在这里做错了什么?

4 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:15)

使用\A代替^

Ruby正则表达式引用:http://www.zenspider.com/ruby/quickref.html#regexen

答案 2 :(得分:8)

你的困惑是合理的。在大多数正则表达式中,^相当于\A$默认等效于\Z,您必须设置“多行”标记才能使其显示它们的其他含义(即线条边界)。在Ruby中,^$ 始终在行边界处匹配。

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

答案 3 :(得分:2)

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

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