Я хотел бы знать, есть ли программное обеспечение, которое с учетом регулярного выражения и, конечно же, некоторые другие ограничения, такие как длина, создает случайный текст, который всегда соответствует заданному регулярному выражению. Благодаря
Генератор случайных текстов на основе регулярных выражений
Ответ 1
Xeger способен это сделать:
String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
Ответ 2
Все регулярные выражения могут быть выражены как контекстно-свободные грамматики. И есть хороший алгоритм, уже разработанный для создания случайных предложений из любого CFG определенной длины. Так что повышайте преобразование регулярного выражения в cfg, применяйте алгоритм и производителю, все готово.
Ответ 3
Посмотрите RandExp Ruby gem. Он делает то, что вы хотите, хотя и ограниченным образом. (Он не будет работать со всеми возможными регулярными выражениями, только регулярными выражениями, которые удовлетворяют некоторым ограничениям.)
Ответ 4
Если вы хотите использовать Javascript, попробуйте randexp.js.
Ответ 5
Да, существует программное обеспечение, которое может генерировать случайное совпадение с регулярным выражением:
- Exrex, Python
- Pxeger, Javascript
- regex-genex, Haskell
- Xeger, Java
- Xeger, Python
- Generex, Java
- rxrdg, С#
- String:: Random, Perl
- regldg, C
- paggern, PHP
- ReverseRegex, PHP
- randexp.js, Javascript
- EGRET, Python/С++
- MutRex, Java
- Fare, С#
- rstr, Python
- randexp, Ruby
- goregen, Go
- bfgex, Java
- regexgen, Javascript
- strgen, Python
- random-string, Java
- regexp-unfolder, Clojure
- string-random, Haskell
- rxrdg, С#
- Regexp:: Genex, Perl
- StringGenerator, Python
- strrand, Go
- regen, Go
- Rex, С#
- regexp-examples, Ruby
Ответ 6
Я не знаю никого, хотя это должно быть возможно. Обычный подход заключается в том, чтобы писать грамматику вместо регулярного выражения, а затем создавать функции для каждого нетерминала, которые произвольно решают, какое производство нужно расширять. Если вы можете опубликовать описание типов строк, которые вы хотите сгенерировать, и на каком языке вы используете, мы сможем начать работу.
Ответ 7
Мы сделали что-то подобное в 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
Ответ 8
Слишком поздно, но это может помочь новичкам, вот полезная 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
Ответ 9
Вместо того, чтобы начинать с регулярного выражения, вы должны искать в написании небольшого контекстного свободного грамматика, это позволит легко сгенерировать такой случайный текст. К сожалению, я не знаю ни одного инструмента, который будет делать это напрямую для вас, поэтому вам нужно самому сделать код, чтобы фактически генерировать текст. Если раньше вы не работали с грамматистами, я предлагаю вам прочитать немного о формате bnf и компиляторах компилятора, прежде чем продолжить...