Простое регулярное выражение, которое очень плохо работает на Ruby

У меня есть простое регулярное выражение Ruby, которое занимает очень много времени, чтобы вычислить:

"fußball "*20 =~ /^([\S\s]{1000})/i

Если я удаляю флаг /i он работает очень быстро. Почему он работает так медленно? (Я не дождался завершения выполнения)

Я знаю, что это регулярное выражение может не иметь смысла, но мне интересно, что находится под капотом.


Отчет об ошибке: https://bugs.ruby-lang.org/issues/14418

Ответ 1

По умолчанию . не соответствует символам новой строки. [\s\S] - это взломать эту проблему. В Ruby вы можете использовать флаг /m, чтобы точка совпадала со всеми символами. Это в документации Ruby Metacharacters и Escapes

[\S\s] по неизвестной причине очень медленный, но вы можете изменить его на "fußball "*20 =~/^(.{1000})/mi который делает то же самое, но быстрее