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





Вместо того, чтобы начинать с регулярного выражения, вам следует подумать о написании небольшого контекстно-свободного грамматика, это позволит вам легко генерировать такой случайный текст. К сожалению, я не знаю ни одного инструмента, который бы делал это напрямую за вас, поэтому вам нужно будет написать немного кода самостоятельно, чтобы фактически сгенерировать текст. Если вы раньше не работали с грамматиками, я предлагаю вам немного прочитать о формате bnf и "компиляторах компиляторов", прежде чем продолжить ...
Мне ничего не известно, хотя это должно быть возможно. Обычный подход - написать грамматику вместо регулярного выражения, а затем создать функции для каждого нетерминала, которые случайным образом решают, какое производство расширять. Если бы вы могли опубликовать описание типов строк, которые вы хотите сгенерировать, и какой язык вы используете, мы сможем помочь вам начать работу.
Не так давно мы сделали что-то похожий на Python для написанного нами Игра RegEx. У нас было ограничение, заключающееся в том, что регулярное выражение должно генерироваться случайным образом, а выбранные слова должны быть настоящими словами. Вы можете скачать законченную игру EXE здесь и исходный код Python здесь.
Вот отрывок:
def generate_problem(level):
keep_trying = True
while(keep_trying):
regex = gen_regex(level)
# print 'regex = ' + regex
counter = 0
match = 0
notmatch = 0
goodwords = []
badwords = []
num_words = 2 + level * 3
if num_words > 18:
num_words = 18
max_word_length = level + 4
while (counter < 10000) and ((match < num_words) or (notmatch < num_words)):
counter += 1
rand_word = words[random.randint(0,max_word)]
if len(rand_word) > max_word_length:
continue
mo = re.search(regex, rand_word)
if mo:
match += 1
if len(goodwords) < num_words:
goodwords.append(rand_word)
else:
notmatch += 1
if len(badwords) < num_words:
badwords.append(rand_word)
if counter < 10000:
new_prob = problem.problem()
new_prob.title = 'Level ' + str(level)
new_prob.explanation = 'This is a level %d puzzle. ' % level
new_prob.goodwords = goodwords
new_prob.badwords = badwords
new_prob.regex = regex
keep_trying = False
return new_prob
Обратите внимание на драгоценный камень RandExp Ruby. Он делает то, что вы хотите, но только ограниченным образом. (Он не будет работать со всеми возможными регулярными выражениями, только с регулярными выражениями, которые соответствуют некоторым ограничениям.)
Все регулярные выражения могут быть выражены как контекстно-свободные грамматики. И есть уже разработан хороший алгоритм для создания случайных предложений из любого CFG заданной длины. Итак, преобразуйте регулярное выражение в cfg, примените алгоритм и бах, все готово.
Любая известная реализация алгоритма? Это долгий шанс?
Я успешно реализовал его в Perl несколько лет назад, и он увидел «производственное» применение, так что, вероятно, я сделал это правильно. Самым сложным в процессе было понимание обозначений, используемых в статье. Убери это препятствие, и ты золотой.
Если я выясню, где находится Perl, я откажусь от него, но ни на что не рассчитываю.
Хм, не могут ли рекурсивные совпадения (они есть в Perl) и условные выражения работать вместе, создавая что-то, что даже не является контекстно-независимым?
Xeger способен на это:
String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
В зависимости от используемого регулярного выражения случайность будет искажена. Например, регулярное выражение «[a-yZ]» будет генерировать в 26 раз больше Z, чем другие буквы. См. code.google.com/p/xeger/wiki/XegerLimitations
Если вам нужно решение Javascript, попробуйте randexp.js.
Слишком поздно, но это может помочь новичку, вот полезный библиотека Java, который предоставляет множество функций для использования регулярного выражения для генерации String (случайная генерация, генерация String на основе его индекса, генерация всех String ..), проверьте здесь.
Пример :
Generex generex = new Generex("[0-3]([a-c]|[e-g]{1,2})");
// generate the second String in lexicographical order that match the given Regex.
String secondString = generex.getMatchedString(2);
System.out.println(secondString);// it print '0b'
// Generate all String that matches the given Regex.
List<String> matchedStrs = generex.getAllMatchedStrings();
// Using Generex iterator
Iterator iterator = generex.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
// it print 0a 0b 0c 0e 0ee 0e 0e 0f 0fe 0f 0f 0g 0ge 0g 0g 1a 1b 1c 1e
// 1ee 1e 1e 1f 1fe 1f 1f 1g 1ge 1g 1g 2a 2b 2c 2e 2ee 2e 2e 2f 2fe 2f 2f 2g
// 2ge 2g 2g 3a 3b 3c 3e 3ee 3e 3e 3f 3fe 3f 3f 3g 3ge 3g 3g 1ee
// Generate random String
String randomStr = generex.random();
System.out.println(randomStr);// a random value from the previous String list
Да, существует программное обеспечение, которое может генерировать случайное совпадение с регулярным выражением:
Он перемещен: github.com/benburkert/randexp