Генерировать регулярные выражения из списка строк

Исходная проблема:

Я что-то читаю из формата регулярного выражения, расширяю и записываю. Этот список может стать огромным при его написании.

Во время записи у меня нет исходных данных регулярного выражения. Итак, мне придется создавать регулярные выражения из строк, которые у меня есть.

Пара случаев при чтении и письме:

Скажем, регулярное выражение для чтения:

abc/*

Поскольку 'abc' может иметь только 'A', 'B', 'C', 'D' (иметь этот список со мной), Above будет переведено в список строк как

"abc/A", "abc/B", "abc/C", "abc/D" -- 1

Скажем, другое регулярное выражение чтения:

def/*/A

Так как def может иметь только 'x', 'y', 'x' (имейте этот список со мной), Above будет переведено в список строк как

"def/x/A", "def/x/A", "def/x/A" -- 2

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

Из числа 1 я должен получить

 abc/*

Из числа 2 я должен получить

 def/*/A

которые являются оригинальными.

Вопрос: Какая структура данных эффективна для решения этой проблемы. Я думал об использовании алгоритма попыток и Ахо-Корасика, но до сих пор не мог придумать четкое решение.

Я был бы рад расширить вопрос, если он не ясен. Учтите, что * не будет соответствовать /, // или чему-либо, кроме символов.

Я не вижу разницы между первыми двумя примерами. Почему можно было бы сгенерировать регулярное выражение для первого, но не для второго?

Some programmer dude 24.04.2018 12:57

@Someprogrammerdude, "abc / D" отсутствует во втором примере. Если я сделаю регулярное выражение как 'abc / *', тогда 'abc / D' также будет учитываться при чтении abc / *

Hemant Bhargava 24.04.2018 12:57

Кроме того, технически регулярное выражение abc/* будет соответствовать abc, abc/, abc// и т. д. С косой чертой. Может вы имеете в виду abc/.? Или с учетом вашего комментария (который должен быть подробно изложен в самом вопросе) abc/[ABCD].

Some programmer dude 24.04.2018 12:58

@Someprogrammerdude, да, ты прав. Виноват. Мы также можем создать регулярное выражение во втором примере. Позвольте мне отредактировать.

Hemant Bhargava 24.04.2018 13:02

Что касается разницы между двумя первыми примерами, как бы вы могли отличить их? Как получить строки в списке? Каков ваш вклад? Какова цель вашей программы? В чем заключается проблема действительный, которую вы хотите решить с помощью регулярных выражений? И помните старую поговорку «У меня проблема. Я решил ее с помощью регулярных выражений. Теперь у меня проблемы с два». Может быть, регулярные выражения не решение вашей реальной проблемы?

Some programmer dude 24.04.2018 13:03

Понятия не имею, что вы имеете в виду под "если я скажу" abc "..."

Passer By 24.04.2018 13:05

@Someprogrammerdude, проблема в том, что я что-то читаю из формата регулярного выражения, расширяю и записываю. Теперь, когда я его записываю, у меня нет исходных данных регулярного выражения. Итак, мне придется создавать из него регулярные выражения.

Hemant Bhargava 24.04.2018 13:05

@PasserBy, точно так же, как в английском языке 26 символов, вы можете предположить, что «abc» будет иметь только 4 варианта. :)

Hemant Bhargava 24.04.2018 13:09

Итак, вы хотите обратный инженер регулярное выражение из некоторого текста? Это действительно невозможно. Возможно, угадать можно использовать как одну из многих возможных альтернатив, но это может быть не фактически используемое регулярное выражение. Возможно, вам стоит подумать о дизайне, в котором вы также сохраняете регулярное выражение, чтобы вы могли получить его позже (по какой-то неизвестной причине)?

Some programmer dude 24.04.2018 13:10

@Someprogrammerdude, Не должно быть невозможного. Я уверен, что решить эту проблему непросто. Для решения может потребоваться много ума.

Hemant Bhargava 24.04.2018 13:13

Опять же, во втором примере: если это все, что у вас есть в качестве входных данных для вашей программы, как вы узнаете, что D является альтернативой? Вы тоже откуда-то получаете список (A, B, C и D)? Откуда вы знаете, что abc/D изначально не входил просто так? Все три альтернативы, которые вы показываете, по-прежнему действительны для abc/[ABCD]. Недостаточно многих деталей, чтобы помочь вам. Не говоря уже о том, что вы не рассказали нам, что вы пробовали и почему ваша попытка не сработала. Пожалуйста, читай о том, как задавать хорошие вопросы.

Some programmer dude 24.04.2018 13:13

@Someprogrammerdude, понятно. Позвольте мне прояснить ситуацию.

Hemant Bhargava 24.04.2018 13:17

@Someprogrammerdude, теперь все круто?

Hemant Bhargava 24.04.2018 13:30

Я не думаю, что вы создаете регулярные выражения. Я думаю, что вы не расширяете подстановочные знаки. Конечно, вам просто нужно убедиться, что позиция «A» в «abc / A» такая же, как «B» в «abc / B» и т. д.

Caleth 24.04.2018 13:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
14
668
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это сложная проблема.

Хорошее возможное решение:

Шаг 1. Преобразуйте список строк в конечную автоматизацию. Как я уже упоминал, для этого я буду использовать «алгоритм Ахо – Корасика».

Шаг 2: Преобразуйте конечную автоматизацию в регулярное выражение ... Примерно так: https://cs.stackexchange.com/questions/2016/how-to-convert-finite-automata-to-regular-expressions

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