Как сохранить / сериализовать скомпилированное регулярное выражение (std :: regex) в файл? - PullRequest
2 голосов
/ 21 декабря 2010

Я использую <regex> из Visal Studio 2010. Я понимаю, что когда я создаю объект регулярного выражения, он компилируется. Нет метода compile , как в других языках и библиотеках, но я думаю, что так оно и есть, я прав?

Мне нужно хранить большое количество скомпилированных регулярных выражений в файле, чтобы я просто получил блок памяти и получил скомпилированное регулярное выражение.

Я не могу понять, как это сделать. Я обнаружил, что в PCRE это возможно , но это библиотека Linux. Существует Windows [версия 2 , но ей 3 года, и я хотел бы использовать более высокоуровневый подход (в версии для Windows нет оболочки на языке c ++).

Так можно ли использовать save std:regex или boost::regex (это так же верно?) Как кусок памяти, а затем просто повторно использовать его позже?

Или есть другая простая библиотека для Windows, которая позволяет это делать?

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

Ответы [ 3 ]

2 голосов
/ 21 декабря 2010

Вы можете использовать сами строки регулярных выражений в качестве «сериализованных» регулярных выражений - просто сохраните их в файл, а затем, когда вы захотите восстановить объекты regex, просто передайте сохраненные строки конструктору regex. *

Единственные недостатки, которые я могу вспомнить:

  • это может занять больше времени, чтобы "восстановить" базу данных регулярных выражений, но я действительно не знаю, сколько (я подозреваю, что время будет зависеть от ввода-вывода, так что я не уверен, если разница было бы важно - я действительно не знаю, сколько накладных расходов приходится на компиляцию регулярных выражений реализацией библиотеки boost)
  • если вы хотите, чтобы сохраненные регулярные выражения были запутаны, вам придется делать это самостоятельно, а не полагаться на то, что скомпилированное двоичное состояние не читается

Преимущества этого:

  • поддерживается на 100%, поэтому он не хрупкий / хрупкий
  • он переносим через версии компилятора и платформы (т.е. не хрупкий / хрупкий)

Является ли время для компиляции базы данных регулярных выражений (исключая ввод-вывод) достаточно значительным, чтобы оправдать попытки сохранить скомпилированное состояние?

1 голос
/ 21 декабря 2010

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

Я не знаю конкретно, как реализована библиотека boost regex, но большинство библиотек regex компилируют вещи в двоичный файлBLOB-объект, который затем интерпретируется как серия инструкций для своего рода ограниченной виртуальной машины.

Если библиотека регулярных выражений boost реализована таким образом, ее сериализация будет относительно простой.Просто возьмите двоичный двоичный объект как-нибудь и сбросьте его на диск.Существование POSIX regex API для библиотеки наддува говорит мне, что, вероятно, именно так оно и реализовано.

OTOH, еще один способ его реализации (и не очень распространенный) - этогенерировать что-то вроде абстрактного синтаксического дерева для регулярного выражения.Это означает, что отдельные части регулярного выражения будут представлены их собственными объектами, и эти объекты будут связаны вместе в какую-то более крупную структуру, представляющую все регулярное выражение.

Если boost делает это таким образом, то сериализация будет оченьcomplex.

Это невозможно с C ++, но я действительно хотел бы, чтобы boost мог компилировать регулярные выражения с константными строками во время компиляции с помощью шаблонного метапрограммирования.Причина, по которой это невозможно, состоит в том, что невозможно перебрать содержимое строки (даже константную строку) с помощью шаблона.

0 голосов
/ 21 декабря 2010

Я не уверен, но вы взглянули на boost :: serialization , который может сериализовать объект C ++?

...