Генератор случайного текста на основе регулярного выражения

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
32
0
19 833
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Вместо того, чтобы начинать с регулярного выражения, вам следует подумать о написании небольшого контекстно-свободного грамматика, это позволит вам легко генерировать такой случайный текст. К сожалению, я не знаю ни одного инструмента, который бы делал это напрямую за вас, поэтому вам нужно будет написать немного кода самостоятельно, чтобы фактически сгенерировать текст. Если вы раньше не работали с грамматиками, я предлагаю вам немного прочитать о формате 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. Он делает то, что вы хотите, но только ограниченным образом. (Он не будет работать со всеми возможными регулярными выражениями, только с регулярными выражениями, которые соответствуют некоторым ограничениям.)

Он перемещен: github.com/benburkert/randexp

martin clayton 31.12.2009 14:07

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

Любая известная реализация алгоритма? Это долгий шанс?

Paralife 08.11.2008 03:10

Я успешно реализовал его в Perl несколько лет назад, и он увидел «производственное» применение, так что, вероятно, я сделал это правильно. Самым сложным в процессе было понимание обозначений, используемых в статье. Убери это препятствие, и ты золотой.

Jay Kominek 08.11.2008 05:29

Если я выясню, где находится Perl, я откажусь от него, но ни на что не рассчитываю.

Jay Kominek 08.11.2008 05:30

Хм, не могут ли рекурсивные совпадения (они есть в Perl) и условные выражения работать вместе, создавая что-то, что даже не является контекстно-независимым?

Joey 28.01.2010 17:41
Ответ принят как подходящий

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

Twilite 18.09.2013 18:14

Если вам нужно решение 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

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

Другие вопросы по теме