Pergunta

Duplicate:

seqüência aleatória que corresponde a uma expressão regular

Não, não é. Eu estou procurando um método fácil e universal, um que eu poderia realmente implementar. Isso é muito mais difícil do que senhas gerar aleatoriamente.


Eu quero criar um aplicativo que leva uma expressão regular, e mostra 10 cordas gerados aleatoriamente que correspondem a esse expressão. É suposto para ajudar as pessoas a compreender melhor as suas expressões regulares, e decidir ou seja, se eles são suficientemente seguro para fins de validação. Alguém sabe de uma maneira fácil de fazer isso?

Uma solução óbvia seria escrever (ou roubar) um analisador de expressão regular, mas que parece realmente sobre a minha cabeça.

repito, eu estou olhando para um fácil e universal maneira de fazer isso.

Editar: abordagem de força bruta está fora de questão. Assumindo as seqüências aleatórias seria apenas [a-z0-9]{10} e 1 milhão de iterações por segundo, levaria 65 anos iterar calha do espaço de todas as cadeias 10 no carvão.

Foi útil?

Solução

Parse sua expressão regular em um DFA , em seguida, atravessar o DFA aleatoriamente até que você acabar em um estado de aceitação, a saída de um personagem para cada transição. Cada passeio irá produzir uma nova cadeia que corresponde à expressão.

Isto não funciona para expressões "regulares" que não são realmente regular, embora, como expressões com referências anteriores. Depende de que tipo de expressão que você está depois.

Outras dicas

Dê uma olhada em Perl Cadeia :: aleatória .

Uma solução bastante feio que podem ou não pode ser prático é aproveitar uma opção de diagnóstico regex existente. Algumas bibliotecas de regex tem a capacidade de descobrir onde o regex não conseguiu igualar. Neste caso, você poderia usar o que é na verdade uma forma de força bruta, mas usando um carácter de cada vez e tentar obter mais (e mais-matching) as cordas até que você tem um jogo completo. Esta é uma solução muito feio. No entanto, ao contrário de uma solução de força bruta padrão, ele falha em uma corda como ab também vai dizer se existe uma cadeia de ab. * Que irá corresponder (se não, pare e tente ac. Se assim for, tente uma cadeia mais longa). Isto provavelmente não é viável com todas as bibliotecas de regex.

No lado brilhante, este tipo de solução é, provavelmente, muito legal a partir de uma perspectiva de ensino. Na prática, é provavelmente similar em efeito a uma solução dfa, mas sem a necessidade de pensar sobre dfas.

Note que você não vai querer usar seqüências aleatórias com esta técnica. No entanto, você pode usar caracteres aleatórios para começar, se você acompanhar o que você testou em uma árvore, de modo que o efeito é o mesmo.

Se o seu único critério é que o seu método é fácil e universal, então não há nada mais fácil ou mais universal do que força bruta. :)

for (i = 0; i < 10; ++i) {
    do {
        var str = generateRandomString();
    } while (!myRegex.match(str));
    myListOfGoodStrings.push(str);
}

É claro, esta é uma maneira muito bobo de fazer as coisas e principalmente foi concebido como uma brincadeira.

Eu acho que sua melhor aposta seria tentar escrever seu próprio analisador muito básico, ensinando-o apenas as coisas que você está esperando encontrar (por exemplo: letra e séries de números, repetindo / caracteres opcionais ... não se preocupe sobre look-behinds etc)

O critério da universalidade é impossível. Dada a expressão regular "^ ser ou não ser - eis a questão: $" , não haverá seqüências aleatórias únicas dez que jogo.

Para os casos não-degenerados:

link da moonshadow a do Perl Cadeia :: aleatório é a resposta. Um programa Perl que lê um RegEx de stdin e escreve a saída de invocações dez de corda :: Aleatório para stdout é trivial. Compilá-lo para qualquer um exe Windows ou Unix com Perl2exe e invocá-lo a partir de PHP, Python, ou o que quer.

Veja também baseado em regex

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top