2012-01-27 3 views
5

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

^EM1650S(B{1,2}|L{1,2})?$ 

генерировать все возможные совпадения:

EM1650S 
EM1650SB 
EM1650SBB 
EM1650SL 
EM1650SLL 
+0

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

+2

Не бесконечно. Просто громогласно. – Alfabravo

+0

Хочется, чтобы это было возможно. – ShankarSangoli

ответ

1

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

Вам просто нужно проанализировать регулярное выражение. Некоторая часть этого (EM1650S) является обязательной, поэтому подумайте обо всем остальном. Разберитесь по символу | (или). Затем перечислим строки для обеих сторон. Тогда вы можете получить все возможные комбинации из них.

Некоторое регулярное выражение (содержащее символы * или +) может представлять бесконечное количество строк, поэтому их нельзя подсчитать.

+0

Я думаю, что OP ищет некоторый признак того, как получить результат_, а не _only_ if это можно сделать ... – cdeszaq

+0

Да, я знаю. :) – 0605002

+0

Это показатель того, как это сделать, это непросто, я не ожидаю, что кто-нибудь потратит свое время, чтобы написать код для OP –

2

В общем случае нет. В этом случае у вас почти нет пространства для решения проблемы.

Есть section covering this in Higher Order Perl (PDF) и Perl module. Я никогда не реализовывал его ни в чем другом, но у меня была аналогичная проблема, и это решение было адекватным для аналогично ограниченных потребностей.

2

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

Вот один написано в Haskell: https://github.com/audreyt/regex-genex и вот модуль Perl: http://metacpan.org/pod/Regexp::Genex

К сожалению, я не смог найти что-нибудь для JavaScript

+1

Интересно. Regexp-Genex ограничивает '*' на '{0,3}' и '+' на '{1,4}', якобы делая его более красивым, но имеет побочный эффект удаления бесконечного пространства решений, иметь. –

+1

Прохладный, генкс предполагает, что '*' '' {0,3} 'и' + 'is' {1,4} 'и, следовательно, производит конечное число перестановок. Ничего себе это мой второй комментарий, что я опаздываю и заканчиваю тем, что являюсь копией чужого комментария. –

+0

Да, это не идеально. Вот дискуссия по Reddit по этой теме: http://www.reddit.com/r/programming/comments/hya57/from_a_regex_generate_all_possible_strings_it_can/ –

1

С вычислительной точки зрения теоретической, регулярные выражения эквивалентны конечным государственные машины. Это часть «теории автоматов». Вы можете создать конечный конечный автомат, который эквивалентен регулярному выражению, а затем использовать алгоритмы обхода графика для прохождения по всем путям FSM. В общем случае счетное бесконечное число строк может соответствовать регулярному выражению, поэтому ваша программа никогда не может заканчиваться в зависимости от входного регулярного выражения.

Смежные вопросы