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/
Другие вопросы по тегам