Ответ 1
Xeger способен это сделать:
String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
Я хотел бы знать, есть ли программное обеспечение, которое с учетом регулярного выражения и, конечно же, некоторые другие ограничения, такие как длина, создает случайный текст, который всегда соответствует заданному регулярному выражению. Благодаря
Xeger способен это сделать:
String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
Все регулярные выражения могут быть выражены как контекстно-свободные грамматики. И есть хороший алгоритм, уже разработанный для создания случайных предложений из любого CFG определенной длины. Так что повышайте преобразование регулярного выражения в cfg, применяйте алгоритм и производителю, все готово.
Посмотрите RandExp Ruby gem. Он делает то, что вы хотите, хотя и ограниченным образом. (Он не будет работать со всеми возможными регулярными выражениями, только регулярными выражениями, которые удовлетворяют некоторым ограничениям.)
Если вы хотите использовать Javascript, попробуйте randexp.js.
Да, существует программное обеспечение, которое может генерировать случайное совпадение с регулярным выражением:
Я не знаю никого, хотя это должно быть возможно. Обычный подход заключается в том, чтобы писать грамматику вместо регулярного выражения, а затем создавать функции для каждого нетерминала, которые произвольно решают, какое производство нужно расширять. Если вы можете опубликовать описание типов строк, которые вы хотите сгенерировать, и на каком языке вы используете, мы сможем начать работу.
Мы сделали что-то подобное в 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
Слишком поздно, но это может помочь новичкам, вот полезная 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
Вместо того, чтобы начинать с регулярного выражения, вы должны искать в написании небольшого контекстного свободного грамматика, это позволит легко сгенерировать такой случайный текст. К сожалению, я не знаю ни одного инструмента, который будет делать это напрямую для вас, поэтому вам нужно самому сделать код, чтобы фактически генерировать текст. Если раньше вы не работали с грамматистами, я предлагаю вам прочитать немного о формате bnf и компиляторах компилятора, прежде чем продолжить...