Pegar parte especifica de uma string usando REGEX

Estou com uma duvida usando Expressões Regulares (Regex)

Como que eu faço para capturar o valor 812.64 dentro dessa frase?

O padrão de inicio pode ser: 1-CURSO, mais eu precisava desconsiderar o restante de palavras até chegar o valor 812.64.

String frase = “1-CURSO T VOLTA NOT IN NM 24 33.86 812.64 T”;

frase = frase.replaceAll(".*(\\d{1,}\\.\\d{2}).*","$1");

@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 ?

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:

@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 ?

Faltou um escape no segundo d:". *(\\d{1,},\\d{2}).* "

Mas olha ai o proposto:

public void testeRegex() {
        String target = "exemplo tem lugar que é 2815,67 ou 115443,82, como fazer pra ele pegar";
        Pattern padrao = Pattern.compile("\\d{1,},\\d{2}");
        Matcher matcher = 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?

Apague o $1 em:

public void testeRegex() {
        String target = "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";
        String regex = "(\\d{1,}-CURSO).*( \\d{1,}\\.\\d{2}) T";
        String filter;
        Pattern padrao = Pattern.compile(regex);
        Matcher matcher = 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?

Se o padrão for mantido, use split:

while (matcher.find()) {
            String[] split = target.substring(matcher.start(), matcher.end()).split(" ");
            System.out.println(split[0]+" "+split[8]);
        }

@PedreiroDeSoftware o padrão é o mesmo, mais usando esse split ele não esta retornando valor nenhum.

Consegue me ajudar nessa tb?

public void testeRegex() {
        String target = "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 pontos
        String regex = "(\\d{1,}-CURSO).*( \\d{1,}[\\.\\d]*\\.\\d{2}) T";
        String filter;
        Pattern padrao = Pattern.compile(regex);
        Matcher matcher = padrao.matcher(target);
        while (matcher.find()) {
            filter = target.substring(matcher.start(), matcher.end());
            System.out.println(filter.replaceAll(regex, "$1 $2"));
        }
    }

2 curtidas

@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…

1 curtida

@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?

Use um ArrayList, pois você está pegando mais de um valor.

ArrayList<String> resultados = new ArrayList<>();//fora do método testeRegex;

while (matcher.find()) {
            filter = target.substring(matcher.start(), matcher.end());
            resultados.add(filter.replaceAll(regex, "$1 $2"));
        }

@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?

olha o erro: Unparseable number: " 812.64"

while(num.charAt(0) == ’ '){num = num.subString(1);}

@PedreiroDeSoftware Estou tentando converter um valor exemplo 110.045,42 de string para NumberFormat

Estou fazendo dessa forma abaixo, só que quando o valor é convertido ele esta vindo sem as casas decimais, tipo 110.045. como resolver isso?

NumberFormat n1 = NumberFormat.getInstance();
valor = n1.parse(numnovo).doubleValue();

Isso se dá porque hora o documento tem vírgula, hora tem ponto e a regex foi calibrada pra ponto.
Deve resolver.

public void testeRegex() {
        ...
        String regex = "(\\d{1,}-CURSO).*( \\d{1,}[\\.\\d]*[\\.,]\\d{2}) T";
        ...
        }
    }

@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,