@PedreiroDeSoftware vi que vc pegou o padrão de 3 números e 2 casas decimais, só que esqueci de falar que a quantidades desses números mudam, esse valor da frase 812,64 tem lugares no meu arquivo que é outro número, exemplo tem lugar que é 2815,67 ou 115443,82, como fazer pra ele pegar dessa forma ?
P
PedreiroDeSoftware
frase = frase.replaceAll(".*(\\d{1,}\\.\\d{2}).*","$1"); essa regex pega números no formato numero.numero;
Se o formato é numero,numero a regex deve ser ajustada para: frase = frase.replaceAll(".*(\\d{1,},d{2}).*","$1");
Ocorre que quando você for fazer o parse, deve trocar a virgula por ponto.
ex: frase.replace(",",".");
Para a procura desejada, você deve usar pattern com o intúito de mapear o início e o fim de cata match referente à expressão regular, e usar o subString(inicio, fim) para pegar o resultado.
O que posso recomendar é apenas que estude, pode começar por aqui:
A
Albertassi88
@PedreiroDeSoftware to estudando direto, ja vi esse video muito bom, mais tem coisas que esta difícil de entender rssrs.
frase = frase.replaceAll(".(\d{1,},d{2}).","$1");
Dessa forma que vc passou ela esta pegando a frase inteira, tem como vc me ajudar só nessa questão de eu pegar a numeração completa independente da quantidade de números ?
P
PedreiroDeSoftware
Faltou um escape no segundo d:". *(\\d{1,},\\d{2}).* "
Mas olha ai o proposto:
publicvoidtesteRegex(){Stringtarget="exemplo tem lugar que é 2815,67 ou 115443,82, como fazer pra ele pegar";Patternpadrao=Pattern.compile("\\d{1,},\\d{2}");Matchermatcher=padrao.matcher(target);while(matcher.find()){System.out.println(target.substring(matcher.start(),matcher.end()));}}}
@PedreiroDeSoftware eu entendi oque vc fez, só que a minha dificuldade esta no exemplo que te passei da minha frase.
Na minha frase tem outros números que não quero pegar.
E os números que quero pegar da minha frase mudam de acordo com o arquivo que estou lendo, tem vez que os ultimos valores são 812.64 ou 44852.64 ou 4456812.64 ou etc…
Frase: 1-CURSO T VOLTA NOT IN NM 24 3333.86 812.64 T
Frase: 1-CURSO T VOLTA NOT IN NM 24 31353.86 44852.64 T
Frase: 1-CURSO T VOLTA NOT IN NM 24 335443.86 4456812.64 T
A minha dificuldade é ignorar toda a minha frase e pegar só a última numeração que pode ser o 812.64, 44852.64, 4456812.64 ou outro qualquer…
Antes da numeração que quero pegar tem outros numeros q mudam de tamanho tb.
A minha regex precisa pega só essa ultima numeração completa independente da quantidade de números…
Lembrando que na minha frase tem a palavra 1-CURSO e eu queria manter essa palavra na minha regex para eu localizar essa frase dentro do meu arquivo que estou lendo, consegue me ajudar?
P
PedreiroDeSoftware
Apague o $1 em:
publicvoidtesteRegex(){Stringtarget="Frase: 1-CURSO T VOLTA NOT IN NM 24 3333.86 812.64 T\n"+"Frase: 1-CURSO T VOLTA NOT IN NM 24 31353.86 44852.64 T\n"+"Frase: 1-CURSO T VOLTA NOT IN NM 24 335443.86 4456812.64 T";Stringregex="(\\d{1,}-CURSO).*( \\d{1,}\\.\\d{2}) T";Stringfilter;Patternpadrao=Pattern.compile(regex);Matchermatcher=padrao.matcher(target);while(matcher.find()){filter=target.substring(matcher.start(),matcher.end());System.out.println(filter.replaceAll(regex,"$1 $2"));}}
Mantenha o $1.
Regex trabalha com reconhecimento de padrões.
Você tem que observar o padrão da sequência.
@PedreiroDeSoftware funcionou direitinho, só que veio outra questão, tem vezes que o número que estou pegando, ele é muito grande e acaba tendo mais de um .(ponto) na numeração, exemplo 1.185.10 ou 22.345.45 ou 122.345.45, nesse caso ele só esta considerando o primeiro número e os 2 últimos, e não completo, como resolver essa questão?
@PedreiroDeSoftware o padrão é o mesmo, mais usando esse split ele não esta retornando valor nenhum.
Consegue me ajudar nessa tb?
P
PedreiroDeSoftware2 likes
publicvoidtesteRegex(){Stringtarget="Frase: 1-CURSO T VOLTA NOT IN NM 24 3333.86 812.64 T\n"+"Frase: 1-CURSO T VOLTA NOT IN NM 24 31353.86 44.852.64 T\n"+"Frase: 1-CURSO T VOLTA NOT IN NM 24 3358443.86 4.456.812.64 T";//a regex não está boa mas pega o valor, para garantir tem que comparar o tamanho do número com a quantidade de pontosStringregex="(\\d{1,}-CURSO).*( \\d{1,}[\\.\\d]*\\.\\d{2}) T";Stringfilter;Patternpadrao=Pattern.compile(regex);Matchermatcher=padrao.matcher(target);while(matcher.find()){filter=target.substring(matcher.start(),matcher.end());System.out.println(filter.replaceAll(regex,"$1 $2"));}}
@PedreiroDeSoftware Deu certo…mano muito obrigado pela sua ajuda, vou estudar mais, pois essa parada é muito louca de entender rsrs, muito obrigado mesmo, Deus te abençõe…
A
Albertassi88
@PedreiroDeSoftware com esse seu código como eu faço para guardar os valores dentro de uma variável?
estou tentando aqui e esta dando erro, pode me ajudar?
P
PedreiroDeSoftware
Use um ArrayList, pois você está pegando mais de um valor.
ArrayList<String>resultados=newArrayList<>();//fora do método testeRegex;while(matcher.find()){filter=target.substring(matcher.start(),matcher.end());resultados.add(filter.replaceAll(regex,"$1 $2"));}
A
Albertassi88
@PedreiroDeSoftware me tira uma dúvida quando eu pego só o valor para jogar em uma variável, o valor esta vindo com um espaço antes, exemplo ( 567,44), como faço para retirar esse espaço?
@PedreiroDeSoftware o documento ja foi convertido todas as virgulas para ponto, o problema esta acontecendo quando eu converto esse valor q esta em string para numberformat pois ele esta vindo sem as casas decimais,
P
PedreiroDeSoftware
A conversão está errada.
A regex captura as casas decimais após o último ponto ou virgula.
publicvoidtesteRegex(){Stringtarget="Frase: 1-CURSO T VOLTA NOT IN NM 24 3333.86 812,64 T\n"+"Frase: 1-CURSO T VOLTA NOT IN NM 24 31353.86 44.852.64 T\n"+"Frase: 1-CURSO T VOLTA NOT IN NM 24 3358443.86 4.456.812,64 T";Stringregex="(\\d{1,}-CURSO).* (\\d{1,}[\\.\\d]*[\\.,]\\d{2}) T";Stringfilter;Patternpadrao=Pattern.compile(regex);Matchermatcher=padrao.matcher(target);while(matcher.find()){filter=target.substring(matcher.start(),matcher.end());System.err.println(filter);System.out.println(filter.replaceAll(regex,"$1 $2"));}}
@PedreiroDeSoftware no meu aqui não deu certo essa última regex, pois ele ta capturando outro valor agora…coloquei uma foto para vc ver como esta a minha e oq esta acontecendo, o valor de 1.185 que foi impresso é referente a conversão de string para NumberFormat e o [812.64, 1.185.10] é da string, precisa converter para NumberFormat com as casas decimais…
@PedreiroDeSoftware essa foto esta completa aonde aparece a conversaõ de virgula para ponto
P
PedreiroDeSoftware1 like
Você extrai certo e formata errado.
Revise o parse.
Sem parse:
publicvoidtesteRegex(){Stringtarget="Frase: 1-CURSO T VOLTA NOT IN NM 24 3333.86 812,64 T\n"+"Frase: 1-CURSO T VOLTA NOT IN NM 24 31353.86 44.852.64 T\n"+"Frase: 1-CURSO T VOLTA NOT IN NM 24 3358443.86 4.456.812,64 T";Stringregex="(\\d{1,}-CURSO).* (\\d{1,}[\\.\\d]*[\\.,]\\d{2}) T";Patternpadrao=Pattern.compile(regex);Matchermatcher=padrao.matcher(target);while(matcher.find()){StringBuildernumero=newStringBuilder(matcher.group(2).replaceAll("[\\.,]",""));numero.insert(numero.length()-2,".");System.out.println(Double.parseDouble(numero.toString()));}}
@PedreiroDeSoftware Como eu comparo os resultados da minha regex?
Estou fazendo dessa forma na foto e não esta dando certo. Eu estou lendo um arquivo em pdf e os resultados da minha regex são da seguinte forma, exemplo:
1-Curso V Priscila 200,00
1-Curso V Priscila 400,00
1-Curso V Paulo 300,00
1-Curso V Italo 250,00
Estou tentando comparar dessa forma: Se os nomes forem iguais conforme tem no meu exemplo. 1-Curso V Priscila for igual o 1-Curso V Priscila preciso somar para ela os 200,00 + 400,00.
Se os nomes não forem iguais cada um fica com o seu valor,
Tentei de várias formas e não consegui fazer essa comparação. como faço para comparar as regex?
Abra outro tópico.
Vc pode usar um Map<String, List<Double>>;
Use o map.putIfAbsent(nome, new ArrayList<>()); para acumular as entradas.
Use o map.get(nome) pra recuperar a lista.
E um for para somar.
P
PedreiroDeSoftware
publicvoidmanipulacaoDeDados(){String[]linhas=("1-Curso V Priscila 200,00\n"+"1-Curso V Priscila 400,00\n"+"1-Curso V Paulo 300,00\n"+"1-Curso V Italo 250,00").split("\n");Map<String,List<Double>>pessoaEValores=newHashMap<>();doublevalor;for(Stringlinha:linhas){String[]colunas=linha.split(" ");valor=Double.parseDouble(colunas[3].replace(",","."));pessoaEValores.putIfAbsent(colunas[2],newArrayList<>());pessoaEValores.get(colunas[2]).add(valor);}pessoaEValores.entrySet().stream().forEach(entry->somarValores(entry.getKey(),entry.getValue()));}publicvoidsomarValores(StringnomePessoa,List<Double>values){doubletotal=values.stream().mapToDouble(Double::doubleValue).sum();System.out.println("Pessoa: "+nomePessoa+", total: "+total);}
A
Albertassi88
@PedreiroDeSoftware obrigado pela sua ajuda, mais antes eu tinha conseguido fazer com base na sua primeira resposta, só não conseguir entender o porque ele esta retornando 2 valores sendo que estou lendo só um nome igual com dois valores. ( o primeiro é um dos valores que foi somado, o segundo esta correto pois é a soma total), aonde esta o erro?
, meio sem sentido, pois o map não contém chaves duplicadas.
Imprima o key.length dentro do for que faz a impressão.
A
Albertassi88
@PedreiroDeSoftware mesmo usando o key.length(), continua imprimindo dois valores…
P
PedreiroDeSoftware
Tire o for de dentro do while.
A
Albertassi88
era isso mesmo, obrigado
A
Albertassi88
@PedreiroDeSoftware eu abri um tópico mais ninguém me responde, tem como vc me ajudar em outra questão?
Estou tendo dificuldades para inserir o if e else, .
O código é o seguinte se valorCompra receber algum valor ele vai entrar no if do valor compra, se ele não receber nenhum valor, ele vai retornar nulo ou zero e a mesma coisa o valorVenda, se receber algum valor ele vai entrar no if do valor Venda, se ele não receber nenhum valor, ele vai retornar nulo.
No primeiro if que é o de compra ele esta me retornando o valor correto, mais no if de venda ele não esta retornado nenhum valor, alguém pode me ajudar?
@PedreiroDeSoftware não entendi muito bem o pq usar o MathContext, no meu caso o MathContext é melhor que Bigdecimal? e com o MathContext eu consigo fazer o if e else e com o Bigdecimal não tem como fazer, seria isso? pois a minha duvida é o porque o if e else não esta funcionando, poderia me dar um exemplo em cima do código?
P
PedreiroDeSoftware
Minha orientação é generalista não é especialista, por isso não conheço bem a classe bigdecimal e não trabalhei com a MathContext.