Pegar parte especifica de uma string usando REGEX

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

A conversão está errada.

A regex captura as casas decimais após o último ponto ou virgula.

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";
    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.err.println(filter);
        System.out.println(filter.replaceAll(regex, "$1 $2"));
    }
}

Corrigido na regex.
Não é mais necessário:

@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

Você extrai certo e formata errado.
Revise o parse.

Sem parse:

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";
        String regex = "(\\d{1,}-CURSO).* (\\d{1,}[\\.\\d]*[\\.,]\\d{2}) T";
        Pattern padrao = Pattern.compile(regex);
        Matcher matcher = padrao.matcher(target);
        while (matcher.find()) {
            StringBuilder numero = new StringBuilder(matcher.group(2).replaceAll("[\\.,]",""));
            numero.insert(numero.length()-2, ".");
            System.out.println(Double.parseDouble(numero.toString()));
        }
    }

1 curtida

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

public void manipulacaoDeDados() {
        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 = new HashMap<>();
        double valor;
        for (String linha : linhas) {
            String[] colunas = linha.split(" ");
            valor = Double.parseDouble(colunas[3].replace(",", "."));
            pessoaEValores.putIfAbsent(colunas[2], new ArrayList<>());
            pessoaEValores.get(colunas[2]).add(valor);
        }
        pessoaEValores.entrySet()
                .stream()
                .forEach(entry -> somarValores(entry.getKey(), entry.getValue()));
    }
    
    public void somarValores(String nomePessoa, List<Double> values){
        double total = values.stream().mapToDouble(Double::doubleValue).sum();
        System.out.println("Pessoa: "+nomePessoa+", total: "+total);
    }

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

:thinking:, meio sem sentido, pois o map não contém chaves duplicadas.
Imprima o key.length dentro do for que faz a impressão.

@PedreiroDeSoftware mesmo usando o key.length(), continua imprimindo dois valores…

Tire o for de dentro do while.

era isso mesmo, obrigado

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

BigDecimal b4 = null;
BigDecimal b10 = null;
BigDecimal b8 = null;
public BigDecimal soma(Double valorCompra, Double valorVenda) {
if (valorCompra == 0) {
BigDecimal b1 = soma0.add(soma1);
BigDecimal b2 = b1.add(soma2);
BigDecimal b3 = b2.add(BigDecimal.valueOf(valorCompra));
b4 = b3.add(BigDecimal.valueOf(correta));
return b4;
} else {

		if (valorVenda == 0) {
			BigDecimal b5 = soma0.add(soma1);
			BigDecimal b6 = b5.add(soma2);
			BigDecimal b7 = b6.add(BigDecimal.valueOf(correta));
			b8 = BigDecimal.valueOf(valorVenda).subtract(b7);
			return b8;
		}
			}
	return b10;
}

Tem que ter paciência.

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

Minha orientação é generalista não é especialista, por isso não conheço bem a classe bigdecimal e não trabalhei com a MathContext.

entendi ok, mais obrigado…