basado en la solución de Wilfred Springer junto con http://www.brics.dk/~amoeller/automaton/ construyo otro generador. No usa recursividad. 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. Utilizo esto para un generador de muestras XML 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()));
}
Cool idea - interested to hear the results. – Ryall
Esto de hecho sería bastante útil. – p3t0r
creo que todos los selectores "... o más" tendrían que estar limitada a pesar de o usted podría terminar con 1.000.000 palabras de caracteres: S – Ryall