Ruby regex: ^ соответствует началу строки даже без модификатора m? - PullRequest
8 голосов
/ 23 ноября 2010

Рубин 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 ]

20 голосов
/ 23 ноября 2010
  • начало строки: ^
  • конец строки: $
  • начало строки: \ A
  • конец строки: \ z
15 голосов
/ 23 ноября 2010

Используйте \A вместо ^.

Справочник по регулярным выражениям Ruby: http://www.zenspider.com/ruby/quickref.html#regexen

8 голосов
/ 23 ноября 2010

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

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

2 голосов
/ 23 ноября 2010

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

str.split("\n")[0] =~ /^hello/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...