Ответ 1
Используйте \A
вместо ^
.
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
вместо ^
.
Ваше замешательство оправдано. В большинстве разновидностей регулярных выражений ^
эквивалентен \A
, а $
по умолчанию эквивалентен \Z
, и вы должны установить флаг "multiline", чтобы заставить их брать другие значения (то есть границы строк), В Ruby, ^
и $
всегда совпадают на границах линии.
Чтобы добавить к путанице, Ruby имеет то, что он называет "многострочным" режимом, но это действительно то, что все остальные называют режимом "однострочный" или "DOTALL": он изменяет значение метасимвола .
, позволяя ему для соответствия символов разделителя строк (например, \r
, \n
), а также всех других символов.
"^" - начало строки. Чтобы сделать то, что вы хотите, вы можете разделить строку и проверить только первую строку. Но я считаю, что есть лучший метод.
str.split("\n")[0] =~ /^hello/