2015-08-27 2 views
1

Мне нужно проверить, существует ли определенный шаблон в начале большой строки (например, порядка гигабайта), и мне интересно, подходят ли регулярные выражения стандартной библиотеки C++.Регулярные выражения C++ для больших строк

Я попытался regex_search с ^ в начале картины, и regex_match с .* в конце картины, но и аварии, когда строка получает до нескольких десятков мегабайт.

Есть ли какой-нибудь трюк, который я должен использовать, или это так, что регулярные выражения C++ не являются подходящим инструментом для больших строк?

Для тестового случая я использовал строку, состоящую полностью из "aaaaaa...", и регулярное выражение, состоящее либо из "^aaa", либо "aaa.*", чтобы оно было простым. Я тестировал на Microsoft C++; любое решение, в конечном итоге, должно работать как с Windows, так и с Linux.

+0

Технически простые случаи, такие как '. *', Могут быть оптимизированы для использования памяти O (1). Возможно, проблема в другом месте. Возможно, вы захотите включить раздражающее регулярное выражение в вопрос. – nhahtdh

+0

@nhahtdh Правильно, такие случаи могут быть настолько оптимизированы, но, похоже, они не по крайней мере в реализации Microsoft. Хорошо, добавил. – rwallace

+2

Проблема с 'regex_search' привязанного регулярного выражения заключается в том, что якорь может соответствовать следующей строке строки. Не имеет значения, действительно ли регулярное выражение совпадает в начале строки, но это означает, что если шаблон не соответствует, остальную часть строки можно найти для экземпляра шаблона, следующего за новой строкой. Используйте 'match_continuous' для фиксации. (Это не должно применяться, поскольку проблема указана, но тогда длинная строка ввода также не должна приводить к сбою. Возможно, вам нужно вставить исполняемый код.) – rici

ответ

0

Одна вещь, которую вы могли бы сделать, это ограничить диапазон поиска, используя итераторы как в этом примере, что только проверяет Шифрование до 100 первых символов:

int main() 
{ 
    std::string s(1024 * 1024 * 1024, 'a'); 

    std::regex e("^aaa"); 

    // limit the range of your search using iterators 
    if(std::regex_search(s.begin(), s.begin() + 100, e)) // 100 max 
    { 
     std::cout << "yes\n"; 
    } 

} 

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

Смежные вопросы