Исходная проблема:
Я что-то читаю из формата регулярного выражения, расширяю и записываю. Этот список может стать огромным при его написании.
Во время записи у меня нет исходных данных регулярного выражения. Итак, мне придется создавать регулярные выражения из строк, которые у меня есть.
Пара случаев при чтении и письме:
Скажем, регулярное выражение для чтения:
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
которые являются оригинальными.
Вопрос: Какая структура данных эффективна для решения этой проблемы. Я думал об использовании алгоритма попыток и Ахо-Корасика, но до сих пор не мог придумать четкое решение.
Я был бы рад расширить вопрос, если он не ясен. Учтите, что * не будет соответствовать /, // или чему-либо, кроме символов.
@Someprogrammerdude, "abc / D" отсутствует во втором примере. Если я сделаю регулярное выражение как 'abc / *', тогда 'abc / D' также будет учитываться при чтении abc / *
Кроме того, технически регулярное выражение abc/* будет соответствовать abc, abc/, abc// и т. д. С косой чертой. Может вы имеете в виду abc/.? Или с учетом вашего комментария (который должен быть подробно изложен в самом вопросе) abc/[ABCD].
@Someprogrammerdude, да, ты прав. Виноват. Мы также можем создать регулярное выражение во втором примере. Позвольте мне отредактировать.
Что касается разницы между двумя первыми примерами, как бы вы могли отличить их? Как получить строки в списке? Каков ваш вклад? Какова цель вашей программы? В чем заключается проблема действительный, которую вы хотите решить с помощью регулярных выражений? И помните старую поговорку «У меня проблема. Я решил ее с помощью регулярных выражений. Теперь у меня проблемы с два». Может быть, регулярные выражения не решение вашей реальной проблемы?
Понятия не имею, что вы имеете в виду под "если я скажу" abc "..."
@Someprogrammerdude, проблема в том, что я что-то читаю из формата регулярного выражения, расширяю и записываю. Теперь, когда я его записываю, у меня нет исходных данных регулярного выражения. Итак, мне придется создавать из него регулярные выражения.
@PasserBy, точно так же, как в английском языке 26 символов, вы можете предположить, что «abc» будет иметь только 4 варианта. :)
Итак, вы хотите обратный инженер регулярное выражение из некоторого текста? Это действительно невозможно. Возможно, угадать можно использовать как одну из многих возможных альтернатив, но это может быть не фактически используемое регулярное выражение. Возможно, вам стоит подумать о дизайне, в котором вы также сохраняете регулярное выражение, чтобы вы могли получить его позже (по какой-то неизвестной причине)?
@Someprogrammerdude, Не должно быть невозможного. Я уверен, что решить эту проблему непросто. Для решения может потребоваться много ума.
Опять же, во втором примере: если это все, что у вас есть в качестве входных данных для вашей программы, как вы узнаете, что D является альтернативой? Вы тоже откуда-то получаете список (A, B, C и D)? Откуда вы знаете, что abc/D изначально не входил просто так? Все три альтернативы, которые вы показываете, по-прежнему действительны для abc/[ABCD]. Недостаточно многих деталей, чтобы помочь вам. Не говоря уже о том, что вы не рассказали нам, что вы пробовали и почему ваша попытка не сработала. Пожалуйста, читай о том, как задавать хорошие вопросы.
@Someprogrammerdude, понятно. Позвольте мне прояснить ситуацию.
@Someprogrammerdude, теперь все круто?
Я не думаю, что вы создаете регулярные выражения. Я думаю, что вы не расширяете подстановочные знаки. Конечно, вам просто нужно убедиться, что позиция «A» в «abc / A» такая же, как «B» в «abc / B» и т. д.





Это сложная проблема.
Хорошее возможное решение:
Шаг 1. Преобразуйте список строк в конечную автоматизацию. Как я уже упоминал, для этого я буду использовать «алгоритм Ахо – Корасика».
Шаг 2: Преобразуйте конечную автоматизацию в регулярное выражение ... Примерно так: https://cs.stackexchange.com/questions/2016/how-to-convert-finite-automata-to-regular-expressions
Я не вижу разницы между первыми двумя примерами. Почему можно было бы сгенерировать регулярное выражение для первого, но не для второго?