Usando expressão regular(regex) para filtrar um arquivo de entrada
13 respostas
regex
fventurajr
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.
A documentação da classe Pattern explica os padrões para construir as regex.
staroski2 likes
Legal, a seguinte regex deve te atender:
"(\\d{4})-(\\d{2})-(\\d{2}).+ /(\\w+)/.+"
fventurajr
Também pensei em usar substring ou split, mas acredito que a REGEX é mais apropriado.
Dragoon
Porque você acha isso?
fventurajr
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.
javaflex1 like
Está se complicando a toa com regex, deixando o código mais complicado de ler sem necessidade.
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.
staroski1 like
Pelo padrão de conteúdo do seu arquivo, também acredito que utilizar o replace com regex é mais prático do que ficar usando split e substring.
fventurajr
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