solo simplificar regulares regular probar palabra online numeros letras expresiones expresion exacta especiales espacio caracteres blanco alfanumerico java regex random data-generation

java - simplificar - ¿Cómo puedo generar texto que coincida con una expresión regular de una expresión regular?



probar expresiones regulares java (5)

Acabo de crear una biblioteca para hacer esto hace un minuto. Está alojado aquí: http://code.google.com/p/xeger/ . Lea atentamente las instrucciones antes de usarlo. (Especialmente el que se refiere a la descarga de otra biblioteca requerida) ;-)

Esta es la forma en que lo usas:

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

Sip, lo leíste bien. Necesito algo que sea capaz de generar texto aleatorio a partir de una expresión regular. Por lo tanto, el texto debe ser aleatorio, pero debe coincidir con la expresión regular. Parece que no existe, pero podría estar equivocado.

Solo un ejemplo: esa biblioteca sería capaz de tomar '' [ab]*c '' como entrada, y generar muestras tales como:

a B C
abbbc
bac

etc.

Actualización: Yo mismo creé algo: Xeger. Consulte http://code.google.com/p/xeger/ .



No estoy al tanto de tal biblioteca. Si está interesado en escribir uno usted mismo, estos son probablemente los pasos que deberá seguir:

  1. Escriba un analizador para expresiones regulares (es posible que desee comenzar con una clase restringida de expresiones regulares).

  2. Usa el resultado para construir un NFA .

  3. (Opcional) Convierta el NFA en DFA .

  4. Cruce aleatoriamente el autómata resultante desde el estado de inicio a cualquier estado de aceptación, mientras almacena los caracteres generados por cada transición.

El resultado es una palabra que es aceptada por la expresión regular original. Para obtener más información, consulte, por ejemplo, Convertir una expresión regular en una Automatización finita determinista .


basado en la solución de Wilfred Springer junto con brics.dk/~amoeller/automaton construyo otro generador. No usa recursión. Toma como entrada la longitud de cadena mínima de patter / regularExpression y la longitud de cadena máxima. El resultado es una cadena aceptada entre la longitud mínima y máxima. También permite algunas de las "clases de caracteres de mano corta" de XML. Lo uso para un XML Sample Generator que construye Cadena válida para facetas.

public static final String generate(final String pattern, final int minLength, final int maxLength) { final String regex = pattern .replace("//d", "[0-9]") // Used d=Digit .replace("//w", "[A-Za-z0-9_]") // Used d=Word .replace("//s", "[ /t/r/n]"); // Used s="White"Space final Automaton automaton = new RegExp(regex).toAutomaton(); final Random random = new Random(System.nanoTime()); final List<String> validLength = new LinkedList<>(); int len = 0; final StringBuilder builder = new StringBuilder(); State state = automaton.getInitialState(); Transition[] transitions; while(len <= maxLength && (transitions = state.getSortedTransitionArray(true)).length != 0) { final int option = random.nextInt(transitions.length); if (state.isAccept() && len >= minLength && len <= maxLength) validLength.add(builder.toString()); final Transition t = transitions[option]; // random transition builder.append((char) (t.getMin()+random.nextInt(t.getMax()-t.getMin()+1))); len ++; state = t.getDest(); } if(validLength.size() == 0) throw new IllegalArgumentException(automaton.toString()+" , "+minLength+" , "+maxLength); return validLength.get(random.nextInt(validLength.size())); }


Here''s algunas implementations de tal bestia, pero ninguna de ellas en Java (y todas excepto la de código cerrado de Microsoft, muy limitada en su soporte de características regexp).