Есть ли способ извлечь поиск из регулярного выражения С++? (вопрос не о регулярных выражениях, а #include <regex>)

учитывая регулярное выражение C++ std, есть ли способ выяснить, что будет искать это регулярное выражение? получить строку, которую вы вставили при ее построении?

Я видел https://en.cppreference.com/w/cpp/regex/basic_regex и здесь нет ничего полезного. Единственное, что я могу сделать, это сгенерировать все возможные строки и посмотреть, какие из них совпадают, но это кажется безумным решением. sizeof(regex) является константой 32 независимо от того, как долго я ищу текст, поэтому о каких-либо злоупотреблениях с памятью не может быть и речи. Я пробовал приводить к строкам и символам *, думая, что, возможно, большинство других подробностей об этом будут известны во время компиляции и будут обрабатываться в типе. Кажется, это должно быть выполнимо. Большая база кода, которой я не владею, поэтому о чем-то вроде переноса регулярного выражения в класс, который можно неявно преобразовать в регулярное выражение, но который также отдельно сохраняет результаты поиска в виде строки, не может быть и речи.

Наверное, невозможно. std::basic_regex обычно не сохраняет шаблон, а анализирует его в механизме, который запрашивает другую строку. Шаблон регулярного выражения отбрасывается, как только заканчивается конструктор/присваивание.

Yksisarvinen 18.05.2024 20:45

«Это похоже на то, что должно быть выполнимо». -- Почему? (Если бы вы реализовали анализатор регулярных выражений, что бы вы предпочли: анализировать шаблон один раз при создании или анализировать его каждый раз, когда используется регулярное выражение?)

JaMiT 18.05.2024 20:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет.*

Кажется, здесь имеется фундаментальное непонимание того, что такое регулярное выражение. Регулярное выражение — это ориентированный граф, представляющий шаблон. Когда вы применяете его к строке, вы не более чем проверяете, соответствует ли строка шаблону, путем успешного обхода графа.

Люди любят удобство. Было бы очень болезненно строить график вручную или использовать специальную программу для рисования графиков для генерации кода, который его строит.

Поэтому вместо этого мы используем очень удобную текстовую строку, представляющую график, который мы обычно называем «регулярным выражением», хотя это всего лишь текстовое представление графика регулярного выражения. Конструкция Regex берет эту строку и строит фактический график DFA (или NFA). После этого мы используем этот график для сопоставления с любыми строками, которые пожелаем.

* Итак, да, мы могли бы получить текстовую строку регулярного выражения из графа, если бы написали код для разложения построенного графа обратно в строку символов, но никому никогда не нужно этого делать! Зачем нам это нужно?

** Вопрос в том виде, в котором он задан, неясен. Мне кажется, что ОП спрашивает, как получить строку, используемую для построения регулярного выражения, обратно из скомпилированного регулярного выражения.

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

Smasheded 19.05.2024 02:05

Ах. Как проверить, описывают ли два регулярных выражения один и тот же шаблон? может быть вам полезен. Но Стандартная библиотека AFAIK не предлагает такой функциональности.

Dúthomhas 19.05.2024 02:14

Нет, не совсем. Речь идет о двух регулярных выражениях, а не о реализации стандарта C++, спрашивает, эквивалентны ли эти 2 (где меня волнует только то, идентичны ли они или даже близки), и ответ: «невозможно доказать невозможность реализации в flex»

Smasheded 19.05.2024 03:03

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

Dúthomhas 19.05.2024 03:06

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

Smasheded 19.05.2024 03:31

@Smasheded Да, в принципе. Если вы не знаете интимных подробностей std::regex (чего вы не знаете, по крайней мере, не в каком-либо кросс-платформенном или обязательно даже кросс-версийном способе) или не анализируете его самостоятельно в минимальный DFA, тогда разумного способа не существует.

Dúthomhas 19.05.2024 07:11

Поскольку вопрос не дает точной мотивации и цели, я полагаю, все же стоит упомянуть, что на практическом уровне классы regex, как правило, имеют закрытый член _Visualization, который представляет собой именно «строку, которую вы вставляете при ее создании» . Это явно неканонично, но, возможно, именно этого добивается @Smasheded.

Jakub 19.05.2024 17:44

Другие вопросы по теме