Estou escrevendo um utilitário Java que me ajuda a gerar muitos dados para testes de desempenho. Seria muito legal poder especificar uma regex para Strings de modo que meu gerador gerasse coisas que correspondessem a isso. Existe algo lá fora que eu possa usar para fazer isso? Ou existe uma biblioteca que me leva quase todo o caminho até lá?
obrigado
Respostas:
Editar: conforme mencionado nos comentários, há uma biblioteca disponível no Google Code para fazer isso: https://code.google.com/archive/p/xeger/
Veja também https://github.com/mifmif/Generex conforme sugerido por Mifmif
Mensagem original:
Em primeiro lugar, com uma regexp complexa o suficiente, acredito que isso pode ser impossível. Mas você deve ser capaz de criar algo para expressões regulares simples.
Se você der uma olhada no código-fonte da classe java.util.regex.Pattern, verá que ele usa uma representação interna das instâncias do Node. Cada um dos diferentes componentes do padrão tem sua própria implementação de uma subclasse de nó. Esses nós são organizados em uma árvore.
Ao produzir um visitante que atravessa essa árvore, você deve ser capaz de chamar um método gerador sobrecarregado ou algum tipo de Builder que junta algo.
fonte
[\w]
. Uma olhada na última linha de seu wiki nos diz isso.dk.brics.automaton
portanto, esteja preparado para adicionar dependências de pom de terceiros. A maioria das pessoas não se importa com isso, mas gostaria que houvesse algo um pouco mais compacto.É tarde demais para ajudar o autor da postagem original, mas pode ajudar um recém-chegado. Generex é uma biblioteca Java útil que fornece muitos recursos para usar regexes para gerar strings (geração aleatória, gerando uma string com base em seu índice, gerando todas as strings ...).
Exemplo:
Divulgação
O projeto mencionado neste post pertence ao usuário que respondeu (Mifmif) à pergunta. De acordo com as regras , isso precisa ser mencionado.
fonte
Xeger (Java) também é capaz de fazer isso:
fonte
Eu fui a raiz de lançar minha própria biblioteca para isso (em c #, mas deve ser fácil de entender para um desenvolvedor Java).
Rxrdg começou como uma solução para um problema de criação de dados de teste para um projeto da vida real. A ideia básica é aproveitar os padrões de validação existentes (expressão regular) para criar dados aleatórios que estejam em conformidade com esses padrões. Desta forma, dados aleatórios válidos são criados.
Não é tão difícil escrever um analisador para padrões regex simples. Usar uma árvore de sintaxe abstrata para gerar strings deve ser ainda mais fácil.
fonte
No podcast stackoverflow 11:
Provavelmente não é o que você está procurando, mas pode ser um bom ponto de partida, em vez de criar o seu próprio.
Não consigo encontrar nada no google, então sugiro resolver o problema analisando uma determinada expressão regular nas menores unidades de trabalho (\ w, [xx], \ d, etc) e escrevendo alguns métodos básicos para oferecer suporte aquelas frases de expressão regular.
Portanto, para \ w, você teria um método getRandomLetter () que retorna qualquer letra aleatória e também getRandomLetter (char startLetter, char endLetter) que fornece uma letra aleatória entre os dois valores.
fonte
Esta pergunta é muito antiga, embora o problema fosse real para mim. Eu tentei xeger e Generex e eles não parecem atender às minhas necessidades. Eles realmente falham em processar alguns dos padrões regex (como
a{60000}
) ou para outros (por exemplo(A|B|C|D|E|F)
) eles simplesmente não produzem todos os valores possíveis. Como não encontrei nenhuma outra solução apropriada, criei minha própria biblioteca.https://github.com/curious-odd-man/RgxGen
Também há artefato disponível na central maven.
Exemplo de uso:
fonte
Eu sei que já existe uma resposta aceita, mas estou usando o Data Generator da RedGate (o que foi mencionado na resposta de Craig) e funciona MUITO bem para tudo que lancei nele. É rápido e me deixa com vontade de usar a mesma regex para gerar os dados reais para coisas como códigos de registro que essa coisa gera.
É necessário um regex como:
e gera toneladas de códigos exclusivos como:
É algum grande algoritmo secreto que RedGate descobriu e estamos todos sem sorte ou é algo que nós, meros mortais, realmente podemos fazer?
fonte
Estou voando e acabei de ver a pergunta: escrevi a solução mais fácil, mas ineficiente e incompleta. Espero que ajude você a começar a escrever seu próprio analisador:
fonte
Você terá que escrever seu próprio analisador, como o autor de String :: Random (Perl) fez. Na verdade, ele não usa regexes em nenhum lugar daquele módulo, é apenas o que os perl-coders estão acostumados.
Por outro lado, talvez você possa dar uma olhada na fonte para obter algumas dicas.
EDIT: Droga, Blair me venceu por 15 segundos.
fonte
Está longe de oferecer suporte a uma expressão regular PCRE completa, mas escrevi o seguinte método Ruby para pegar uma string semelhante a regexp e produzir uma variação nela. (Para CAPTCHA baseado em idioma.)
fonte
Esta pergunta é muito antiga, mas me deparei com ela em minha própria pesquisa, então vou incluir alguns links para outras pessoas que podem estar procurando a mesma funcionalidade em outros idiomas.
fonte
Se você deseja gerar strings "críticas", pode considerar:
EGRET http://elarson.pythonanywhere.com/ que gera strings "malignas" cobrindo suas expressões regulares
MUTREX http://cs.unibg.it/mutrex/ que gera strings de detecção de falhas por mutação regex
Ambos são ferramentas acadêmicas (sou um dos autores deste último) e funcionam razoavelmente bem.
fonte