Простое регулярное выражение, которое очень плохо работает на 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
который делает то же самое, но быстрее