Подтвердить что ты не робот

Случайная строка, которая соответствует регулярному выражению

Как вы собираетесь создавать случайную буквенно-цифровую строку, которая соответствует определенному регулярному выражению?

Это специально для создания исходных паролей, которые выполняют обычные требования к паролю.

4b9b3361

Ответ 2

Welp, просто размышляя, но общий вопрос о генерации случайных входов, соответствующих звукам регулярных выражений, применим ко мне для достаточно расслабленного определения случайного и достаточно жесткого определения регулярного выражения. Я думаю о классическом формальном определении, которое допускает только() | * и символы алфавита.

Регулярные выражения могут быть сопоставлены с формальными машинами, называемыми конечными автоматами. Такая машина представляет собой ориентированный граф с определенным node, называемым конечным состоянием, a node, называемым начальным состоянием, и буквой из алфавита на каждом ребре. Слово принимается регулярным выражением, если оно может начинаться в исходном состоянии и пересекать одно ребро, помеченное каждым символом через график, и заканчиваться в конечном состоянии.

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

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

Может быть, это отправная точка для размышлений о проблеме, хотя!

Теперь, когда я написал это, мне кажется, что было бы проще повторить выбор, чтобы упростить шаблон регулярного выражения, пока вы не останетесь с простой строкой. Найдите первый символ не алфавита в шаблоне. Если он a *, повторите предыдущий элемент несколько раз и удалите *. Если это |, выберите, какой из OR'd элементов сохранить и удалить остальные. Для левого пара, сделайте то же самое, но посмотрите на персонажа, следующего за правильным парном. Это, вероятно, проще, если сначала проанализировать регулярное выражение в представлении дерева, что упрощает работу с структурой группировки пар.

Для человека, который беспокоился о том, что решение о том, что регулярное выражение действительно соответствует чему-либо, эквивалентно проблеме остановки: Нет, обычные языки хорошо себя ведут. Вы можете указать, описывают ли какие-либо два регулярных выражения один и тот же набор принятых строк. Вы в основном делаете машину выше, а затем следуете алгоритму для создания канонической минимальной эквивалентной машины. Сделайте это для двух регулярных выражений, затем проверьте, эквивалентны ли минимальные машины, что является простым.

Ответ 3

String:: Random в Perl создаст случайную строку из подмножества регулярных выражений:

#!/usr/bin/perl

use strict;
use warnings;

use String::Random qw/random_regex/;

print random_regex('[A-Za-z]{3}[0-9][A-Z]{2}[[email protected]#$%^&*]'), "\n";

Ответ 4

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

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

(На самом деле, возможно, не удастся создать случайные совпадения в самом общем смысле - у меня смутная память о том, что проблема "любая строка соответствует этому регулярному выражению" - это проблема с закрытием. вы можете иметь больше удачи.)

Ответ 5

Я написал Parsley, который состоит из Lexer и генератора.

  • Lexer предназначен для преобразования регулярной строки типа выражения в последовательность токенов.
  • Генератор использует эти токены для создания определенного количества кодов.
$generator = new \Gajus\Parsley\Generator();

/**
 * Generate a set of random codes based on Parsley pattern.
 * Codes are guaranteed to be unique within the set.
 *
 * @param string $pattern Parsley pattern.
 * @param int $amount Number of codes to generate.
 * @param int $safeguard Number of additional codes generated in case there are duplicates that need to be replaced.
 * @return array
 */
$codes = $generator->generateFromPattern('FOO[A-Z]{10}[0-9]{2}', 100);

В приведенном выше примере будет создан массив, содержащий 100 кодов, каждый из которых имеет префикс "FOO", а затем 10 символов из "ABCDEFGHKMNOPRSTUVWXYZ23456789" сена и 2 номера из стопки сена "0123456789".

Ответ 6

Эта библиотека PHP выглядит многообещающе: ReverseRegex

Как и все из них, он обрабатывает только подмножество регулярных выражений, но может выполнять довольно сложные вещи, такие как UK Postcodes:

([A-PR-UWYZ]([0-9]([0-9]|[A-HJKSTUW])?|[A-HK-Y][0-9]([0-9]|[ABEHMNPRVWXY])?) ?[0-9][ABD-HJLNP-UW-Z]{2}|GIR0AA)

Выходы

D43WF
B6 6SB
MP445FR
P9 7EX
N9 2DH
GQ28 4UL
NH1 2SL
KY2 9LS
TE4Y 0AP

Ответ 7

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

Намного легче было бы написать генератор случайных паролей с определенными правилами (начинается с строчной буквы, имеет как минимум одну пунктуацию, заглавную букву и номер, не менее 6 символов и т.д.), а затем напишите регулярное выражение так, чтобы любое пароли, созданные с указанными правилами, действительны.

Ответ 8

Предполагая, что у вас есть как минимальная длина, так и требование 3-из-4 * (или аналогичного), я просто склонен использовать приличный генератор паролей.

Я создал пару в прошлом (как в Интернете, так и в командной строке) и никогда не пропускал более одной сгенерированной строки, чтобы передать правило 3 из 4.

  • 3-of-4: должен иметь как минимум три из следующих характеристик: строчные, прописные, цифры, символ

Ответ 9

Возможно (например, модуль Haskell regexp имеет набор тестов, который автоматически генерирует строки, которые должны соответствовать определенным регулярным выражениям).

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

Ответ 10

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

/[a-zA-Z]{6}/

тогда вы знаете, что вам нужны 6 букв a-z или A-Z, поэтому сгенерируйте их. Разумеется, это может стать более привлекательным, и, в зависимости от ваших потребностей, вы можете полностью переписать весь парсер регулярных выражений, но вы можете прекратить добавлять функции, когда вы выполнили свои требования.