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
我在这里做错了什么?
答案 0 :(得分:20)
答案 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/