2008-11-07 32 views
26

Me gustaría saber si hay software que, con una expresión regular y, por supuesto, otras restricciones como la longitud, produzca texto aleatorio que siempre coincida con la expresión regular dada. GraciasGenerador de texto aleatorio basado en la expresión regular

+0

pregunta duplicado: http://stackoverflow.com/questions/22115/using-regex-to-generate-strings-rather-than- match-them –

Respuesta

20

Xeger es capaz de hacerlo:

String regex = "[ab]{4,6}c"; 
Xeger generator = new Xeger(regex); 
String result = generator.generate(); 
assert result.matches(regex); 
+1

Aha ... nombre increíble !! – gui11aume

+3

Dependiendo de la expresión regular utilizada, la aleatoriedad será sesgada. Por ejemplo, la expresión regular '[a-yZ]' generará 26 veces más 'Z' que otras letras. Ver http://code.google.com/p/xeger/wiki/XegerLimitations – Twilite

0

En lugar de comenzar con una expresión regular, debe buscar escribir una gramática libre de contexto pequeño, esto le permitirá generar fácilmente dicho texto aleatorio. Lamentablemente, no conozco ninguna herramienta que lo haga directamente por usted, por lo que tendrá que hacer un poco de código para generar realmente el texto. Si no ha trabajado con gramáticas anteriormente, le sugiero que lea un poco sobre el formato bnf y los "compiladores del compilador" antes de continuar ...

1

No conozco ninguna, aunque debería ser posible. El enfoque habitual es escribir una gramática en lugar de una expresión regular, y luego crear funciones para cada terminal no terminal que decida aleatoriamente qué producción expandir. Si puede publicar una descripción de los tipos de cadenas que desea generar y el idioma que está utilizando, es posible que podamos comenzar.

1

Hicimos algo similar en Python no hace mucho tiempo para un RegEx game que escribimos. Teníamos la restricción de que la expresión regular tenía que generarse aleatoriamente, y las palabras seleccionadas tenían que ser palabras reales. Puede descargar el juego completo EXE here y el código fuente de Python here.

Aquí hay un fragmento:

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

Mira la RandExp Rubí joya. Hace lo que quiere, aunque solo de manera limitada. (No funcionará con todas las expresiones regulares posibles, solo las expresiones regulares que cumplan algunas restricciones).

+1

Se movió: http://github.com/benburkert/randexp –

12

Todas las expresiones regulares se pueden expresar como gramáticas libres de contexto. Y existe a nice algorithm already worked out para producir oraciones aleatorias, desde cualquier CFG, de una longitud determinada. Así que convierta la expresión regular a cfg, aplique el algoritmo, y listo, listo.

+0

¿Alguna implementación conocida del algo? ¿Es esto una posibilidad remota? – Paralife

+0

Lo implementé con éxito en Perl hace años, y vio el uso de 'producción', así que probablemente lo hice bien. La parte más difícil del proceso fue comprender la notación utilizada en el documento. Despeja ese obstáculo y estás dorado. –

+1

Si descubro dónde está el Perl, lo arrojaré, pero no cuente con nada. –

1

demasiado tarde pero podría ayudar a recién llegado, aquí es una utilidad java library que proporcionan muchas características para el uso de expresiones regulares para generar String (generación aleatoria, generar cadena basada en ella de índice, generar toda cadena ..) a verlo here.

Ejemplo:

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 
5

Sí, existe un software que puede generar una coincidencia aleatoria a una expresión regular:

Cuestiones relacionadas