Точка не соответствует символам новой строки, поэтому она выбирает символ перед повторением для данной строки, что является ничем.По сути, то же самое, что и /(?=repeats)/
, так как повторяет это первое слово в этой строке.
Добавление флага m
(сделать новые строки точечными) решит это для вас
str.match(/(.*)repeats/m)
#=> #<MatchData "Whenever ThingA happens\nrepeats" 1:"Whenever ThingA happens\n">
причина, по которой работает первая, потому что \s
обозначает символ пробела, и это соответствует новой строке \n
, поскольку новая строка является символом пробела.
Группа без захвата не оказывает влияния, как указано @CarySwoveland