Мне нужно проверить, существует ли определенный шаблон в начале большой строки (например, порядка гигабайта), и мне интересно, подходят ли регулярные выражения стандартной библиотеки C++.Регулярные выражения C++ для больших строк
Я попытался regex_search
с ^
в начале картины, и regex_match
с .*
в конце картины, но и аварии, когда строка получает до нескольких десятков мегабайт.
Есть ли какой-нибудь трюк, который я должен использовать, или это так, что регулярные выражения C++ не являются подходящим инструментом для больших строк?
Для тестового случая я использовал строку, состоящую полностью из "aaaaaa..."
, и регулярное выражение, состоящее либо из "^aaa"
, либо "aaa.*"
, чтобы оно было простым. Я тестировал на Microsoft C++; любое решение, в конечном итоге, должно работать как с Windows, так и с Linux.
Технически простые случаи, такие как '. *', Могут быть оптимизированы для использования памяти O (1). Возможно, проблема в другом месте. Возможно, вы захотите включить раздражающее регулярное выражение в вопрос. – nhahtdh
@nhahtdh Правильно, такие случаи могут быть настолько оптимизированы, но, похоже, они не по крайней мере в реализации Microsoft. Хорошо, добавил. – rwallace
Проблема с 'regex_search' привязанного регулярного выражения заключается в том, что якорь может соответствовать следующей строке строки. Не имеет значения, действительно ли регулярное выражение совпадает в начале строки, но это означает, что если шаблон не соответствует, остальную часть строки можно найти для экземпляра шаблона, следующего за новой строкой. Используйте 'match_continuous' для фиксации. (Это не должно применяться, поскольку проблема указана, но тогда длинная строка ввода также не должна приводить к сбою. Возможно, вам нужно вставить исполняемый код.) – rici