Estou com o seguinte problema. O pessoal da infraestrutura nos passou um log com os acessos a um servidor intranet, onde um padrão se repete: yyyy-MM-dd … //…
Estou lendo esse arquivo, linha a linha, e gravando um arquivo .csv de saída e para isso eu aplico na linha de entrada um replaceFirst("(....)-(..)-(..).+/(.+)/.+", "$3/$2/$1;$4") e grava em um arquivo de saída.
Está funcionando, mas gostaria de simplificar a REGEX usando algo como: "\(d{4})-(\d\d)-(\d\d)\W+/(\w+)/.+", "$3/$2/$1;$4")
Por que não aceita \d - dígitos, \W - não alfanumérico, \w - alfabético e o quantificador {4} - exatamente quatro caracteres?
Alguém com experiência em usar expressão regular em Java para me ajudar?
O caractere \ é um caractere de controle, então quando você for escrever a regex em um literal String, o \ tem que ser digitado como \\.
Então por exemplo o \d no literal String vai ser \\d, o \W vai ser \\W e assim por diante.
Só tem que conferir se a regex está de acordo com o que você precisa, a regex abaixo:
"(\\d{4})-(\\d{2})-(\\d{2})\\W+/(\\w+)/.+"
Significa:
<4 dígitos> - <2 dígitos> - <2 dígitos> <caractere não alfanumérico pelo menos 1 vez> / <caractere alfanumérico pelo menos 1 vez> / <qualquer caracteres pelo menos 1 vez>
A documentação da classe Pattern explica os padrões para construir as regex.
Porque segue um padrão. A data vem no começo, mas não sei se o tamanho da string que representa o ip se altera e ainda nos casos em que o método não é GET, mas POST. Teria que testar isso.
dia = linha.substring(8, 2);
mes = linha.substring(5, 2);
ano = linha.substring(0, 4);
data = dia + "/" + mes + "/" + ano;
if ( linha.instr("GET") != -1 ) {
sistema = linha.substring(20, 4);
} else {
sistema = linha.substring(21, 4);
}
Seria usar Substring mesmo, já a lógica de programação fica a seu critério. Poderia extrair a data inteira e depois mandar o java converter pra Date se necessário, depende de qual vai ser o destino dessa data.
Estou pensando em usa um dicionário(HashMap) para acumular o acesso aos sistemas ao longo do mês e outro com um resumo. Algo como: Sistema-dia Acessos ABCD-01/10 3 ABSD-02/10 15 … ABCD-29/10 1 ABSD-30/10 13
e