Introdução
Expressões - Part01
Compreender algumas expressões é uma das maneiras mais assertivas para se poder interagir em qualquer contexto de comunicação, e na programação não seria diferente, afinal, é através de escrita de algumas expressões que nos comunicamos e definimos as execuções que serão realizadas pelo nosso software.

Nesta fase de seus estudos você já deve facilmente compreender expressões iguais a estas abaixo:
a = b + c representa que: a é igual a soma de b mais c 
        
a = b > c representa que: a será verdadeiro se b for maior que c
a = b <> c representa que: a será verdadeiro se b for diferente que c (linguagem x)
a = b != c representa que: a será verdadeiro se b for diferente que c (linguagem z)
Mas e as expressões abaixo? Qual será a sua representação e finalidade na programação?
representa a geração de um texto com números com zeros à esquerda e números com 2 casas decimais
com base nos 3 argumentos recebidos respectivamente 
%s%010d%,.2f 
representa uma validação de e-mail
^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})$ 
Formatação
Imagina que recebemos a tarefa de realizar a confecção de cupom de venda não fiscal que inicialmente será exibida no console para depois salvar em arquivo.
Nem tudo o que vemos é o que realmente é

No contexto do paradigma da orientação a objetos, percebemos que o mais relevante no começo, é definir o modelo de classes para criação de nossos objetos 😲.
Definição
A classe String possui o método estático chamado format conforme assinatura abaixo:
format(String format, Object ... args)
- O parâmetro 
String formatrepresentará o formato esperado - O parâmetro 
Object ... argsrepresentará o(s) valore(s) que será(ão) formatado(s) 

Imagina como ficará a formatação do endereço no cupom em uma única linha? Esse será um de nossos desafios !!!
Tipos e especificadores
Expressões - Part02
Cada tipo de dado é representado para um caractere especificador prefixado pelo símbolo % que representa o início de cada especificador. Abaixo segue a lista com os mais utilizados
| especificador | tipos de dados | 
|---|---|
| %s | Uma string de caracteres | 
| %d | Dígitos inteiros | 
| %f | Dígitos fracionados | 
| %t | Representação de data e hora | 
Estrutura de formatação
O parâmetro que representa a formatação possui a flexibilidade de receber em sua sintaxe os argumentos abaixo:
| nome | valores | descrição | 
|---|---|---|
| index | 1$ ,2$ e etc | representa ao índice dos argumentos que começa com 1 | 
| flags | 0, - | Utilizado para determinado zeros ou alinhamento à esquerda, dependente do tipo | 
| width | 5, 10, e etc | Comprimento do texto formatado | 
| .precision | 2, 3 e etc | Define a quantidade de caracteres decimais | 
| typechar | s, d, f e etc | tipo de dado que será formatado | 
Mão na massa
Vamos realizar algumas formatações para compreendermos todos os conceitos citados acima.
Altere o código abaixo conforme os cenários apresentados:
public class StringFormat {
    public static void main(String[] args) {
        String formato="O nome do candidato é %s";
        String argumento="Gleyson Sampaio";
        System.out.println(String.format(formato, argumento));
    }
}
Formatação básica
| string de formatação | argumentos | resultado | 
|---|---|---|
| "O nome do candidato é %s" | Gleyson Sampaio | O nome do candidato é Gleyson Sampaio | 
| "O nome do candidato é %40s" | Gleyson Sampaio | O nome do candidato é Gleyson Sampaio - comprimento de 40 caracteres justificado a direita | 
| "O nome do candidato é %-40s" | Gleyson Sampaio | O nome do candidato é Gleyson Sampaio - comprimento de 40 caracteres justificado a esquerda | 
| "O salário pretendido do candidato foi de R$ %,.2f" | 5357.45 | O salário pretendido do candidato foi de R$ 5.357,45 | 
| "A matrícula do candidato é %05d" | 32 | A matrícula do candidato é 00032 | 
Formatação avançada
| string de formatação | argumentos | resultado | 
|---|---|---|
| "O candidato será entrevistado na data %td/%tm/%ty" | data, data, data | O candidato será entrevista da data 18/06/23 | 
| "O candidato será entrevistado na data %tD" | data | O candidato será entrevistado na data 06/18/23 (Locale US ou Default) | 
| "O candidato será entrevistado na data %1$td/%1$tm/%1$ty" | data | O candidato será entrevistado na data 18/06/23, pois informamos o mesmo índice 1$ dos argumentos | 
| "O candidato será entrevistado na data %td/%<tm/%<ty" | data | O candidato será entrevistado na data 18/06/23, o símbolo < representa considerar o argumento anterior | 
| "Os diferentes nomes %10.10s e %10.10s agora possuem o mesmo comprimento" | GLEYSON SAMPAIO, IZABELLY SAMPAIO | Os diferentes nomes GLEYSON SA e IZABELLY S agora possuem o mesmo comprimento | 
| "A terceira e segunda habilidades do candidato são %3$s e %2$s" | "Java", "Spring", "Postgres", "Vue" | A terceira e segunda habilidades do candidato são Postgres e Spring | 
Hora da verdade
Expressões - Part03
Segue abaixo o código que nos auxiliará a compreender sobre formatação utilizando String.format.
public class Endereco {
    String cep;
    String logradouro;
    String numero;
    String complemento;
    String bairro;
    //não está na UML pois o modelo pode variar
    String cidade;
    String uf;
}
Existem algumas divergências nas especificações para que possamos refletir sobre as respectivas soluções e omitirmos os métodos getters e setters para fins de redução de conceitos.
Chegou a hora de aplicar tudo que abordamos para implementarmos o desafio apresentado, segue abaixo o código que precisa ser complementado com o que aprendemos para conseguirmos concluir o requisito de impressão de cupom.
public class ImpressorCupom {
    public void imprimir(Cupom cupom){
        /**
         vamos somente imprimir o resultado no console
         mas este mesmo conteúdo poderá proporcionar várias saídas
         logo a variável conteúdo deveria ser retornada para outros "processadores"
         como gerador de arquivo txt, pdf ou até mesmo envio por e-mail
         */
        /*
        CONSIDERE O COMPRIMENTO MÁXIMO DE 50 CARACTERES EM CADA LINHA
        E APLIQUE O RESPECTIVO ALINHAMENTO
         */
        StringBuilder conteudo = new StringBuilder();
        conteudo.append(tracos());
        conteudo.append(cupom.nomeFantasia + "\n"); //preencher com espaços até ter 50 caracteres de comprimento
        Endereco end = cupom.endereco;
        conteudo.append(end.logradouro + " N. " + end.numero + " " + end.complemento + " " + end.bairro + " " + end.cidade + "-" + end.uf + "\n"); //como formatar vários campos
        conteudo.append("CPF/CNPJ:" + cupom.cpf + " " + cupom.data + "\n");//calcular os respectivos comprimentos e aplicar alinhamento
        conteudo.append("IE:" + cupom.ie + " " + cupom.hora + "\n");//calcular os respectivos comprimentos e aplicar alinhamento
        conteudo.append("IM:" + cupom.im + " " +  "CCF:" + cupom.ccf + "\n");//calcular os respectivos comprimentos e aplicar alinhamento
        conteudo.append("CDD:" + cupom.cdd + "\n");//aplicar alinhamento à direita
        conteudo.append(tracos());
        conteudo.append("CUPOM FISCAL\n");
        //modelo para ser replicado
        conteudo.append(String.format("ITEM COD. %-30s%10s\n","DESCRIÇÃO","VALOR"));
        for(CupomItem item:cupom.itens){
            conteudo.append("DESCRICAO DE ACORDO COM CADA ITEM EXISTENTE\n");
        }
        conteudo.append(tracos());
        System.out.println(conteudo.toString());
        //em caso de resolver explorar algumas formas de apresentação
        //return conteudo.toString();
    }
    private String tracos(){
        String repeated = new String(new char[50]).replace("\0", "-");
        return repeated + "\n";
    }
    private String cpfCnpj(String cpfCnpj){
        String newCnpj = "";
        if(cpfCnpj.length()==11)
            newCnpj = cpfCnpj.replaceAll("(\\d{3})(\\d{3})(\\d{3})(\\d{2})", "$1.$2.$3-$4");
        else
            newCnpj = cpfCnpj.replaceAll("(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})", "$1.$2.$3/$4-$5");
        return newCnpj;
    }
}
A solução apresentada acima foi desenvolvida sem explorarmos todo o potencial do uso de formatação de caracteres, agora é com você 😉.
Nos próximos capítulos mergulharemos em um contexto que para muitos é extremamente complexo que são os conceitos de RegEx - Regular Expression ou Expressão Regular, não deixe de conferir.