Ruby regex: ^ соответствует началу строки даже без модификатора 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

Что я здесь делаю неправильно?

Ответ 2

  • начало строки: ^
  • конец строки: $
  • начало строки:\A
  • конец строки:\z

Ответ 3

Ваше замешательство оправдано. В большинстве разновидностей регулярных выражений ^ эквивалентен \A, а $ по умолчанию эквивалентен \Z, и вы должны установить флаг "multiline", чтобы заставить их брать другие значения (то есть границы строк), В Ruby, ^ и $ всегда совпадают на границах линии.

Чтобы добавить к путанице, Ruby имеет то, что он называет "многострочным" режимом, но это действительно то, что все остальные называют режимом "однострочный" или "DOTALL": он изменяет значение метасимвола ., позволяя ему для соответствия символов разделителя строк (например, \r, \n), а также всех других символов.

Ответ 4

"^" - начало строки. Чтобы сделать то, что вы хотите, вы можете разделить строку и проверить только первую строку. Но я считаю, что есть лучший метод.

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