Здравствуйте. Допустим, у нас есть некое регулярное выражение, описывающее конечное количество удовлетворяющих подстановок. Есть ли стандартная функция (в стандартной или бустовской реализации), которая помогла бы "обойти" все допустимые варианты? Ну и выдала бы ошибку, если вариантов не ограничено или нереально много.
Здравствуйте, Went, Вы писали:
W>Здравствуйте. Допустим, у нас есть некое регулярное выражение, описывающее конечное количество удовлетворяющих подстановок. Есть ли стандартная функция (в стандартной или бустовской реализации), которая помогла бы "обойти" все допустимые варианты? Ну и выдала бы ошибку, если вариантов не ограничено или нереально много.
/(foo)/ = /^.*(foo).*$/ — это нереально много или как?
Стандартной функции нет, а рукодельную — для несложных регекспов можно и руками наколбасить.
Перекуём баги на фичи!
Re[2]: Перебрать все варианты регулярного выражения
Здравствуйте, Кодт, Вы писали:
К>/(foo)/ = /^.*(foo).*$/ — это нереально много или как?
Я с трудом читаю сложные регулярные выражения, мало опыта, ХЗ что это значит.
К>Стандартной функции нет, а рукодельную — для несложных регекспов можно и руками наколбасить.
Ну вот я и думаю — писать кривой недовелосипед на основе регулярок (с моим околонулевым опытом в них) или написать свой компактный и быстрый велосипед на основе собственного синтаксиса? Мне нужны именно перечисляемые множества строк, типа:
foo(10|20|30) // Перечисляется в foo10 foo20 foo30
foo(1~3) // Перечисляется в foo1 foo2 foo3
foo(1~2)(a|b) // Перечисляется в foo1a foo1b foo2a foo2b
Ну то есть такой примитив. Анализировать регекспы в поисках подобного, выдавая ошибки на неподходящем — это костыль какой-то, не?
Re[3]: Перебрать все варианты регулярного выражения
Здравствуйте, Went, Вы писали:
К>>/(foo)/ = /^.*(foo).*$/ — это нереально много или как? W>Я с трудом читаю сложные регулярные выражения, мало опыта, ХЗ что это значит.
К>>Стандартной функции нет, а рукодельную — для несложных регекспов можно и руками наколбасить. W>Ну вот я и думаю — писать кривой недовелосипед на основе регулярок (с моим околонулевым опытом в них) или написать свой компактный и быстрый велосипед на основе собственного синтаксиса? Мне нужны именно перечисляемые множества строк, типа: W>
W>foo(10|20|30) // Перечисляется в foo10 foo20 foo30
W>foo(1~3) // Перечисляется в foo1 foo2 foo3
W>foo(1~2)(a|b) // Перечисляется в foo1a foo1b foo2a foo2b
W>
W>Ну то есть такой примитив. Анализировать регекспы в поисках подобного, выдавая ошибки на неподходящем — это костыль какой-то, не?
хз. регекспы вроде к твоей задаче параллельны.
попробуй сделать граф переходов и запусти обход. при достижении конечной вершины выводи найденую последовательность и продолжай обход.
или нужно именно регэкспами сделать?
Re[3]: Перебрать все варианты регулярного выражения
Здравствуйте, Went, Вы писали:
W>Ну вот я и думаю — писать кривой недовелосипед на основе регулярок (с моим околонулевым опытом в них) или написать свой компактный и быстрый велосипед на основе собственного синтаксиса? Мне нужны именно перечисляемые множества строк, типа: W>
W>foo(10|20|30) // Перечисляется в foo10 foo20 foo30
W>foo(1~3) // Перечисляется в foo1 foo2 foo3
W>foo(1~2)(a|b) // Перечисляется в foo1a foo1b foo2a foo2b
W>
W>Ну то есть такой примитив. Анализировать регекспы в поисках подобного, выдавая ошибки на неподходящем — это костыль какой-то, не?
Здравствуйте, night beast, Вы писали:
NB>хз. регекспы вроде к твоей задаче параллельны. NB>попробуй сделать граф переходов и запусти обход. при достижении конечной вершины выводи найденую последовательность и продолжай обход. NB>или нужно именно регэкспами сделать?
Нет, такой задачи не стоит. Просто не хочется велосипедить там, где казалось бы, это уже решено. Но нет, не решено
Re[5]: Перебрать все варианты регулярного выражения
Здравствуйте, Went, Вы писали:
W>Здравствуйте, night beast, Вы писали: NB>>хз. регекспы вроде к твоей задаче параллельны. NB>>попробуй сделать граф переходов и запусти обход. при достижении конечной вершины выводи найденую последовательность и продолжай обход. NB>>или нужно именно регэкспами сделать? W>Нет, такой задачи не стоит. Просто не хочется велосипедить там, где казалось бы, это уже решено. Но нет, не решено
Здравствуйте, Went, Вы писали:
К>>/(foo)/ = /^.*(foo).*$/ — это нереально много или как? W>Я с трудом читаю сложные регулярные выражения, мало опыта, ХЗ что это значит.
Это я к тому, что регекспы могут использоваться для проверки вхождения подстроки в произвольную строку (и понятное дело, что у этой произвольной строки бесконечное количество префиксов-суффиксов вокруг искомой). Это тот самый случай "нереально много".
А могут для сопоставления со строкой целиком.
К>>Стандартной функции нет, а рукодельную — для несложных регекспов можно и руками наколбасить. W>Ну вот я и думаю — писать кривой недовелосипед на основе регулярок (с моим околонулевым опытом в них) или написать свой компактный и быстрый велосипед на основе собственного синтаксиса? Мне нужны именно перечисляемые множества строк, типа: W>
W>foo(10|20|30) // Перечисляется в foo10 foo20 foo30
W>foo(1~3) // Перечисляется в foo1 foo2 foo3
W>foo(1~2)(a|b) // Перечисляется в foo1a foo1b foo2a foo2b
W>
W>Ну то есть такой примитив. Анализировать регекспы в поисках подобного, выдавая ошибки на неподходящем — это костыль какой-то, не?
То есть, тебе по некоторой компактной записи нужно генерировать строки? И ты хочешь заранее предсказать — будет ли количество нагенерённых строк разумным.
Регулярки во всей их полноте — заморочны для нужд генерирования. Особенно, если это PCRE, которые, вообще-то, являются подклассом контекстно-зависимых грамматик!
Но синтаксис их хорош уже тем, что парный к твоему генератору парсер/матчер — это стандартный парсер регулярок.
Поэтому смело бери подмножество синтаксиса регулярок, и не парься!
Класс символов там будет записываться как [a-z] вместо твоего a~z, а в остальном практически всё то же самое.
Понадобятся ли тебе операторы повторения — {m;n}, ? = {0;1}, * = {0;}, + = {1;} — это на вкус и цвет. Скорее всего, не понадобятся, потому что наличие * или + сразу означает, что строк будет "нереально много"
Перекуём баги на фичи!
Re[4]: Перебрать все варианты регулярного выражения
Здравствуйте, Кодт, Вы писали: К>Но синтаксис их хорош уже тем, что парный к твоему генератору парсер/матчер — это стандартный парсер регулярок. К>Поэтому смело бери подмножество синтаксиса регулярок, и не парься!
А смогу ли я как-то использовать std::regex для разбора синтаксиса выражения или генератор придется писать полностью самому?
Re[5]: Перебрать все варианты регулярного выражения
Здравствуйте, Went, Вы писали:
W>А смогу ли я как-то использовать std::regex для разбора синтаксиса выражения или генератор придется писать полностью самому?
Не сможешь, std::regex — это чёрный ящик.
Но твоё подмножество регулярок очень простое, написать простейший парсер труда не составит.
Таким образом элегантно (хотя, признаю, синтаксис указания регулярного выражения выглядит перегруженным) в три строчки описывается целое семейство контролов на форме.
NB>а почему '/8|16|24|32|64/' дублирует именно <widget> : .option NB>а не только <widget> или <widget> : .option}
Ну, это синтаксис языка такой. '/8|16|24|32|64/' — это имя узла (как y_snap или y, их можно "в полной форме" писать как 'y_snap', 'y'), но так как оно ограничено слешами, то это мультиимя — отвечает на все перечисленные варианты. <widget> — это признак узла, пометка для перечислений. : .option — указание на то, что узел наследован от узла option, размещенного рядом (в нашем случае, у предка корневого узла size, отнаследованного в свою очередь от узла category).
То есть это не макрос, который при парсинге разворачивается в множество, а особое имя узла.
Здравствуйте, night beast, Вы писали:
NB>в целом понятно. NB>выбор цифр в качестве имени несколько сбивает с току.
Да, язык не запрещает этого (хотя можно было и добавить какой-то префикс явно). Это удобно, потому что потом это имя используется в качестве инициализатора для других полей объекта:
Поле value рассчитывается как второй с конца элемент пути (то есть это и будет та цифра 8, 16 и т.д.), а поле command потом автоматически рассчитывается как имя категории плюс эта цифра в скобках, то есть перечисляемые кнопки автоматически привязываются к командам size(8), size(16) и т.д. А потом где-то в коде С++ пишем:
Здравствуйте, Went, Вы писали:
NB>>в целом понятно. NB>>выбор цифр в качестве имени несколько сбивает с току. W>Да, язык не запрещает этого (хотя можно было и добавить какой-то префикс явно). Это удобно, потому что потом это имя используется в качестве инициализатора для других полей объекта: W>
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Went, Вы писали:
NB>>>в целом понятно. NB>>>выбор цифр в качестве имени несколько сбивает с току. W>>Да, язык не запрещает этого (хотя можно было и добавить какой-то префикс явно). Это удобно, потому что потом это имя используется в качестве инициализатора для других полей объекта: W>>