Problema com expressão regular - String.replaceAll() [Resolvido]

Bom dia,

Estou estudando, expressões regulares, com java. Para usar com Java SE, e inventei de fazer uma formatação no estilo moeda, em uma string.

public class ExercicioRegex {
    private String valor;

    public ExercicioRegex() {
        this.valor = "1234567890";
    }

    public String getValor() {
        return this.valor;
    }

    public static void main(String args[]) {
        ExercicioRegex regex = new ExercicioRegex();

        String saidaTexto = regex.getValor().replaceAll("(\\d{2}$)", ",$1");

        System.out.println(saidaTexto);
    }

}

A saida: 12345678,90

Agora to apanhando, pra por os pontos, que indicam milhar. Ex:

12.345.678,90

Como consigo, a saida, do ex acima?

[]s

EDIT: Ajuste no titulo do post.

Use a classe java.text.DecimalFormat observando os métodos herdados da classe ancestral abstrata NumberFormat pois Expressões Regulares são adequadas para identificar padrões e opcionalmente extrair dados.

Sugiro como exercício que faça o contrário: validar uma string contendo valor monetário via expressão regular, embora seja possível usar o método parse da classe DecimalFormat.

[]'s

Bom dia :slight_smile:

Não é exatamente esse o caso, Gokuro, não que discorde do que você disse, sobre a validação. Mas sem margem a dúvida, o metodo replaceAll(), foi adicionado justamente para isso, substituir termos que se encaixem, em uma ER.

Só estou procurando, conhecer e aprimorar dois recursos, ao mesmo tempo :smiley: Todo caso, o que você sugeriu é, uma boa ideia! Obrigado :slight_smile: Vamos lá!

public class ExercicioRegex {
    private String valor;

    public ExercicioRegex() {
        this.valor = "1234567890";
    }

    public String getValor() {
        return this.valor;
    }

    public static void main(String args[]) {
        ExercicioRegex regex = new ExercicioRegex();
        
        String saidaTexto = regex.getValor().replaceAll("(\\d{0,2})?(\\d{3})*(\\d{2}{1}$)", "$1.$2,$3");

        boolean valorOk = saidaTexto.matches("(\\d{0,2})?(\\.\\d{3})*(,\\d{2}{1}$)");

        if(!valorOk) {
            saidaTexto = "Valor invalido!";
        }

        System.out.println("Valor: " + saidaTexto);
    }

}

A saida:

Valor: 12.678,90

A validação, funcionou, a primeiro momento. Mas, não consegui, carregar os números: 3, 4 e 5; No valor de saida.

Como posso arrumar isso?

[]s

Boa noite,

Acabei modificando a espressão regular, para ajustar a saida de acordo, com o que era previsto. O problema está em que o grupo, que antecedia o “*”, encontra diversas ocorrencias, e isso impede acesso a todos os resultados selecionados.

O codigo ficou assim:

public class ExercicioRegex {
    private String valor;

    public ExercicioRegex() {
        this.valor = "1234567890";
    }

    public String getValor() {
        return this.valor;
    }

    public static void main(String args[]) {
        ExercicioRegex regex = new ExercicioRegex();
        
        String saidaTexto = regex.getValor().replaceAll("(\\d{0,2})?(\\d{3})?(\\d{3})?(\\d{2}){1}$", "$1.$2.$3,$4");

        boolean valorOk = saidaTexto.matches("(\\d{0,2})?(\\.\\d{3})*(,\\d{2}){1}$");

        if(!valorOk) {
            saidaTexto = "Valor invalido!";
        }

        System.out.println("Valor: " + saidaTexto);
    }

}

[]s