учитывая регулярное выражение C++ std, есть ли способ выяснить, что будет искать это регулярное выражение? получить строку, которую вы вставили при ее построении?
Я видел https://en.cppreference.com/w/cpp/regex/basic_regex и здесь нет ничего полезного. Единственное, что я могу сделать, это сгенерировать все возможные строки и посмотреть, какие из них совпадают, но это кажется безумным решением. sizeof(regex) является константой 32 независимо от того, как долго я ищу текст, поэтому о каких-либо злоупотреблениях с памятью не может быть и речи. Я пробовал приводить к строкам и символам *, думая, что, возможно, большинство других подробностей об этом будут известны во время компиляции и будут обрабатываться в типе. Кажется, это должно быть выполнимо. Большая база кода, которой я не владею, поэтому о чем-то вроде переноса регулярного выражения в класс, который можно неявно преобразовать в регулярное выражение, но который также отдельно сохраняет результаты поиска в виде строки, не может быть и речи.
«Это похоже на то, что должно быть выполнимо». -- Почему? (Если бы вы реализовали анализатор регулярных выражений, что бы вы предпочли: анализировать шаблон один раз при создании или анализировать его каждый раз, когда используется регулярное выражение?)
Отвечает ли это на ваш вопрос? Как проверить, описывают ли два регулярных выражения один и тот же шаблон?
Кажется, здесь имеется фундаментальное непонимание того, что такое регулярное выражение. Регулярное выражение — это ориентированный граф, представляющий шаблон. Когда вы применяете его к строке, вы не более чем проверяете, соответствует ли строка шаблону, путем успешного обхода графа.
Люди любят удобство. Было бы очень болезненно строить график вручную или использовать специальную программу для рисования графиков для генерации кода, который его строит.
Поэтому вместо этого мы используем очень удобную текстовую строку, представляющую график, который мы обычно называем «регулярным выражением», хотя это всего лишь текстовое представление графика регулярного выражения. Конструкция Regex берет эту строку и строит фактический график DFA (или NFA). После этого мы используем этот график для сопоставления с любыми строками, которые пожелаем.
* Итак, да, мы могли бы получить текстовую строку регулярного выражения из графа, если бы написали код для разложения построенного графа обратно в строку символов, но никому никогда не нужно этого делать! Зачем нам это нужно?
** Вопрос в том виде, в котором он задан, неясен. Мне кажется, что ОП спрашивает, как получить строку, используемую для построения регулярного выражения, обратно из скомпилированного регулярного выражения.
Что мне действительно хотелось, так это извлечь какое-то уникальное представление регулярного выражения, чтобы я мог проверить, идентичны ли два регулярных выражения, и я хотел бы, чтобы это было текстовое представление, чтобы я мог проверить его при нескольких выполнениях программы и достаточно удобочитаемым для человека, чтобы я мог определить регулярное выражение как исходное из исходной строки. Если есть стандартный способ извлечь информацию, содержащуюся в этом графике, из типа регулярного выражения, это было бы здорово, если бы не
Ах. Как проверить, описывают ли два регулярных выражения один и тот же шаблон? может быть вам полезен. Но Стандартная библиотека AFAIK не предлагает такой функциональности.
Нет, не совсем. Речь идет о двух регулярных выражениях, а не о реализации стандарта C++, спрашивает, эквивалентны ли эти 2 (где меня волнует только то, идентичны ли они или даже близки), и ответ: «невозможно доказать невозможность реализации в flex»
Э, в этом ответе говорится, что это разрешимо, и дается еще одна ссылка (извините) на сообщение, в котором рекомендуется вычислить минимальный DFA, который действительно скажет вам, компилируются ли два регулярных выражения по одному и тому же шаблону. Опять же, Стандартная библиотека не предлагает такой функциональности. Итак... если вы не сделаете это сами (или не найдете библиотеку, которая сделает это за вас), то ответ будет «не использовать стандарт C++».
Я имею в виду, что даже извлечение автоматов из объекта регулярного выражения было бы шагом, который мне нужен, чтобы сделать то, что мне нужно, но похоже, что нет способа сделать это, так что ладно.
@Smasheded Да, в принципе. Если вы не знаете интимных подробностей std::regex
(чего вы не знаете, по крайней мере, не в каком-либо кросс-платформенном или обязательно даже кросс-версийном способе) или не анализируете его самостоятельно в минимальный DFA, тогда разумного способа не существует.
Поскольку вопрос не дает точной мотивации и цели, я полагаю, все же стоит упомянуть, что на практическом уровне классы regex
, как правило, имеют закрытый член _Visualization
, который представляет собой именно «строку, которую вы вставляете при ее создании» . Это явно неканонично, но, возможно, именно этого добивается @Smasheded.
Наверное, невозможно.
std::basic_regex
обычно не сохраняет шаблон, а анализирует его в механизме, который запрашивает другую строку. Шаблон регулярного выражения отбрасывается, как только заканчивается конструктор/присваивание.