Ruby регулярное выражение, возвращающее неожиданные результаты при сопоставлении строки, содержащей символы \ n - PullRequest
0 голосов
/ 07 июня 2019

Ниже выводится моя irb консоль

2.3.2 :001 > str = "Whenever ThingA happens\nrepeats: Sunday, Monday and Tuesday\n\n\nDo ThingB"
 => "Whenever ThingA happens\nrepeats: Sunday, Monday and Tuesday\n\n\nDo ThingB"

2.3.2 :002 > str.match(/(.*)\s*(?:repeats)/)
 => #<MatchData "Whenever ThingA happens\nrepeats" 1:"Whenever ThingA happens">

2.3.2 :003 > str.match(/(.*)(?:repeats)/)
 => #<MatchData "repeats" 1:"">

Может кто-нибудь помочь мне понять, что происходит со вторым регулярным выражением /(.*)(?:repeats)/, что приводит к тому, что он не возвращает ожидаемый результат, когда возвращается первое регулярное выражение /(.*)\s*(?:repeats)/?

On rubular.com 2-е регулярное выражение показывает следующее совпадение 1. Whenever ThingA happens\n, которое ожидается, однако Ruby String # match возвращает неожиданные результаты, как показано в выводе консоли выше.

1 Ответ

4 голосов
/ 07 июня 2019

Точка не соответствует символам новой строки, поэтому она выбирает символ перед повторением для данной строки, что является ничем.По сути, то же самое, что и /(?=repeats)/, так как повторяет это первое слово в этой строке.

Добавление флага m (сделать новые строки точечными) решит это для вас

str.match(/(.*)repeats/m)
#=> #<MatchData "Whenever ThingA happens\nrepeats" 1:"Whenever ThingA happens\n">

причина, по которой работает первая, потому что \s обозначает символ пробела, и это соответствует новой строке \n, поскольку новая строка является символом пробела.

Группа без захвата не оказывает влияния, как указано @CarySwoveland

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...