Здравствуйте. Вопрос к программистам.
Сталкивались ли вы когда-нибудь в своей практике с программами, в которых регулярные выражения генерировались бы во время рантайма. Писали ли ты такие программы сами? Как вы думаете, хорошее ли это решение?
Столкнулся с подобным решением совсем недавно, в классе который позволяет находить и распознавать достаточно сложный номенклатурный номер.
Примерный листинг (не реальный, но очень похоже):
var codeParser = new CodeParser();
codeParser.Prefix = new [] { "0001", "0002", "A001", "A002" };
codeParser.Suffix = CodeParser.Suffixes.Before1995 | CodeParser.Suffixes.Public | CodeParser.Suffixes.Restricted;
codeParser.Postfix = CodeParser.Postfixes.Default;
codeParser.Extensions = new [] { "cdr", "dwg", "ai" };
codeParser.Format = @"^.+\s*<prefix>-<postfix>-(<suffix>)\.<extension>$"
Внутри парсера происходит несколько замен в строке Format, которая в итоге разворачивается в следующее выражение:
^.+\s*\(?\s*(?<prefix>0001|0002|A001|A002)-(?<postfix>[А-Я]{3})-(?<suffix>A\d{4}AA|Z9999ZZ)\s*\)?\s*\.(?<extension>cdr|dwg|ai)$
Это выражение распознаёт номер в, допустим, следующем названии файла (самих файлов тысячи, формат записи номенклатурного номера разный, для чего приходится прогонять имена файлов по нескольким парсерам):
Подвеска передняя правая (0001-АБВ-A1234AA).dwg
Скажу честно - в данном конкретном случае этот подход работает на практике и он действительно экономит мне время и нервы (не хочу представлять как я писал бы регулярку под все форматы написания номера, а потом шерстил бы бесконечные списки файлов в поисках тех, которые регулярка не распознала). Более того, с самим выражением я не работаю, а передаю в парсер список имён, на что мне парсер отдаёт не просто названия отобранных файлов, а структуры с названием, разобранным номером и некоторыми очень полезными данными, которые удаётся вынуть из номера (в каких проектах используется, замены, модификации и прочее).
И всё таки у меня вопрос - а правильно ли здесь использовать регулярное выражение? За исключением того момента, что раз работает - значит правильно.
P.S.: никто не собирается нарушать главное правило программиста и переписывать что-то, что и так работает (да и кто бы дал мне это переписывать), просто хочу знать мнение своих более опытных коллег.