Perl — сгенерировать всю совпадающую строку в регулярное выражение

Я новичок в Perl, я хотел знать, есть ли способ генерировать все комбинации, соответствующие регулярному выражению.

как лучше всего сгенерировать все совпадающие строки:

05[0,2,4,7][\d]{7}

заранее спасибо.


person RonenIL    schedule 19.05.2012    source источник
comment
Я согласен с комментарием Кендалла Фрея ниже, вы, вероятно, пытаетесь сделать что-то не так, поэтому вам, вероятно, следует попытаться описать свою основную проблемную ситуацию.   -  person TLP    schedule 19.05.2012
comment
Это часто задаваемый вопрос. Я проголосовал за это из-за отсутствия исследований. - Редактировать: и действительно, он уже появлялся на SO раньше: /4208733/ stackoverflow.com/questions/4605289/   -  person daxim    schedule 19.05.2012
comment
может быть, вам следует узнать что-нибудь об обычных языках и других вещах, связанных с формальной грамматикой?   -  person gaussblurinc    schedule 19.05.2012


Ответы (4)


Нет способа сгенерировать все совпадения для определенного регулярного выражения. Рассмотрим это:

a+

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

Кстати, я думаю, вы хотите, чтобы ваше регулярное выражение выглядело так:

05[0247]\d{7}
person Kendall Frey    schedule 19.05.2012
comment
Спасибо, каков эффективный способ генерации этих строк? - person RonenIL; 19.05.2012
comment
Вам нужно будет использовать что-то другое, кроме регулярного выражения, поскольку регулярные выражения слишком гибкие. Кроме того, нет эффективного способа. Лучшее, что вы можете получить, — это экспоненциальное время. Я не знаю, в чем ваша проблема, но я предполагаю, что есть большая вероятность, что вы делаете это неправильно. - person Kendall Frey; 19.05.2012
comment
нет проблем, я просто хочу сгенерировать все эти числа для целей тестирования. - person RonenIL; 21.05.2012

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

Вы можете использовать glob для создания комбинаций:

perl -lwe "print for glob '05{0,2,4,7}'"
050
052
054
057

Однако мне не нужно было говорить вам, что \d{7} на самом деле означает довольно много миллионов комбинаций, верно? Создание списка чисел тривиально, их форматирование можно выполнить с помощью sprintf:

my @nums = map sprintf("%07d", $_), 0 .. 9_999_999;

Это предполагает, что вы ищете только числа 0-9.

Возьмите эти числа и объедините их с глобусами: Тада.

person TLP    schedule 19.05.2012

2012 ответ

person daxim    schedule 19.05.2012

Затем есть способ сгенерировать все (четыре миллиарда) совпадений для этого определенного регулярного выражения, а именно 05[0247]\d{7}:

use Modern::Perl;

for my $x (qw{0 2 4 7}) {
    say "05$x" . sprintf '%07d', $_ for 0 .. 9999999;
}
person Kenosis    schedule 20.05.2012