Ruby regex: ^ соответствует началу строки даже без модификатора m?
Рубин 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 ответа
Использование \A
вместо ^
,
Справочник по регулярным выражениям Ruby: http://www.zenspider.com/ruby/quickref.html
- начало строки: ^
- конец строки: $
- начало строки: \A
- конец строки: \z
Ваше замешательство оправдано. В большинстве регулярных выражений, ^
эквивалентно \A
а также $
эквивалентно \Z
по умолчанию, и вы должны установить "многострочный" флаг, чтобы они приобрели другие значения (то есть границы линий). В рубине ^
а также $
всегда совпадают на границах линий.
Чтобы добавить путаницу, в Ruby есть то, что он называет "многострочным" режимом, но на самом деле это то, что все остальные называют "однострочным" или "DOTALL" режимом: он меняет значение .
метасимвол, позволяющий ему соответствовать символам разделителя строк (например, \r
, \n
) а также все остальные персонажи.
"^" - начало строки. Чтобы сделать то, что вы хотите, вы можете разбить строку и проверить только первую строку. Но я думаю, что существует какой-то лучший метод.
str.split("\n")[0] =~ /^hello/