Duvida de Regex

8 respostas
aalvesii

Boa tarde,

Estou com uma dúvida de Regex, estou criando uma aplicação que seleciona uma parte de um texto, porém ele seleciona o máximo possível que a seleção pode ter, e eu gostaria de selecionar o mínomo possével, exemplo.

Se eu uso a regex “R.*r” (já tentei várias expressões diferentes) na string “Regular Expressions” o sesultado que obtenho é “Regular Expr”, porém eu gostaria de obter o resultado “Regular”

Será que alguém me dá uma mão?
Obrigado pela atenção!

8 Respostas

Bravox

ve se assim funciona!

R[a-z]*r

T

Você tem de usar “?", não "”. Um exemplo:

import java.util.regex.*;

class Greedy {
    public static void main(String[] args) {
	    Pattern pat1 = Pattern.compile ("R.*r"); // greedy
		Pattern pat2 = Pattern.compile ("R.*?r"); // reluctant
		String str = "Regular Expressions";
		Matcher mat1 = pat1.matcher (str);
		Matcher mat2 = pat2.matcher (str);
		// Imprime "Regular Expr"
		if (mat1.find())
		    System.out.println ("Greedy:    [" + mat1.group() + "]");
		// Imprime "Regular"
		if (mat2.find())
		    System.out.println ("Reluctant: [" + mat2.group() + "]");
	}
}
aalvesii

oh shit!
é... assim funciona, o problema é q meu código é um pouco mais complicado q isso. Vou passar tipo um resumo dele.

public static void main(String[] arvs) {

        String texto = "[DSC_DADO]\nC00000f0fI000bbe32V0cSQLDP,V1.1.0XU0213insert into PEDIDO_COMPRA_PONTO_VENDA " +
                "(COD_DISTRIBUIDOR, COD_PONTO_VENDA, COD_PEDIDO_COMPRA_PDV, DAT_SOLICITACAO, DAT_ATENDIMENTO, " +
                "IND_SITUACAO, VLR_DESCONTO, VLR_ACRESCIMO, VLR_TOTAL, VLR_MARGEM, DSC_OBSERVACAO, " +
                "DAT_ENTRADA_SINCR_ATEN, IND_SITUACAO_FINANCEIRO, COD_USUARIO, COD_SISTEMA, IND_TIPO_PEDIDO, " +
                "DAT_ENVIO_DECISION, DAT_ENVIO_FILA_PROCESSAMENTO, IND_SOLICITACAO_CONFIRMA, " +
                "COD_CONCENTRADOR_PDV_CELULAR, COD_CONDICAO_PAGAMENTO, COD_INTERFACE_ORIGEM) values " +
                "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " +
                "T16IIITTSNNNNSTSSSSTTSIIIP00000004124fP00000002bbP000000051e0e3P0000000e20070706102559" +
                "P0000000a<*[NULL]*>P00000001AP000000030.0P000000030.0P00000005100.3P000000030.0" +
                "P00000022Transação de Solicitação de PedidoP0000000a<*[NULL]*>P00000001AP00000000P00000007MIRVPDV"
                + "P00000001NP0000000a<*[NULL]*>P0000000a<*[NULL]*>P00000001AP000000010P00000001a" +
                "P0000000a<*[NULL]*>XU00d5insert into ITEM_PED_COMPRA_PDV (COD_DISTRIBUIDOR, COD_PONTO_VENDA, "
                + "COD_PEDIDO_COMPRA_PDV, COD_IPED_COMPRA_PDV, COD_TIPO_VOUCHER, QTD_PEDIDA, VLR_ITEM, " +
                "VLR_DESCONTO, VLR_MARGEM) values (?, ?, ?, ?, ?, ?, ?, ?, ?) T09IIIIIINNNP00000004124f" +
                "P00000002bbP000000051e0e3P000000010P00000003bb9P000000012P000000042.85P000000030.0P000000035.0"
                + "P00000004124fP00000002bbP000000051e0e3P000000011P00000004138aP000000014P000000044.75" +
                "P000000030.0P000000035.0P00000004124fP00000002bbP000000051e0e3P000000012P000000042711" +
                "P000000014P000000039.5P000000030.0P000000035.0P00000004124fP00000002bbP000000051e0e3" +
                "P000000013P000000044e21P000000012P0000000418.8P000000030.0P000000036.0XL0094update " +
                "ITEM_EST_VOUCHER_DISTRIBUIDOR set COD_PONTO_VENDA = ?, COD_PEDIDO_COMPRA_PDV = ?, " +
                "DAT_CONFIR_PED_PDV = ? where (COD_ITEM_ESTOQUE_VOUCHER = ?)T04IITIP00000002bbP000000051e0e3"
                + "P0000000e20070706102602P0000000712b78c4P00000002bbP000000051e0e3P0000000e20070706102602" +
                "P0000000712b78c5P00000002bbP000000051e0e3P0000000e20070706102602P0000000717636adP00000002bb" +
                "P000000051e0e3P0000000e20070706102602P0000000717636aeP00000002bbP000000051e0e3" +
                "P0000000e20070706102602P00000007178ee55P00000002bbP000000051e0e3P0000000e20070706102602" +
                "P00000007178ee56P00000002bbP000000051e0e3P0000000e20070706102602P00000007178ee57P00000002bb"
                + "P000000051e0e3P0000000e20070706102602P00000007178ee58P00000002bbP000000051e0e3" +
                "P0000000e20070706102602P0000000717eafaaP00000002bbP000000051e0e3P0000000e20070706102602" +
                "P0000000717eafabP00000002bbP000000051e0e3P0000000e20070706102602P0000000717eafacP00000002bb"
                + "P000000051e0e3P0000000e20070706102602P0000000717eafadS0089 update ESTOQUE_VOUCHER_DISTRIBUIDOR"
                + "set QTD_ESTOQUE = QTD_ESTOQUE - ?   where (COD_DISTRIBUIDOR = ?)     and (COD_TIPO_VOUCHER = ?)"
                + "T03IIIP000000012P00000004124fP00000003bb9P000000014P00000004124fP00000004138aP000000014" +
                "P00000004124fP000000042711P000000012P00000004124fP000000044e21S00a0update ITEM_PED_COMPRA_PDV "
                +"set \nCOD_DISTRIBUIDOR = ?, \nCOD_PONTO_VENDA = ?, \nCOD_PEDIDO_COMPRA_PDV = ?\n where "
                + "COD_DISTRIBUIDOR = ?\n and COD_PONTO_VENDA = ?\n and COD_PEDIDO_COMPRA_PDV = ?\n and " +
                "COD_IPED_COMPRA_PDV = ?T07IIIIIIIP00000004124fP00000002bbP000000051e0e3P00000004124fP00000002bb"
                + "P000000051e0e3P000000010P00000004124fP00000002bbP000000051e0e3P00000004124fP00000002bb" +
                "P000000051e0e3P000000011P00000004124fP00000002bbP000000051e0e3P00000004124fP00000002bb" +
                "P000000051e0e3P000000012P00000004124fP00000002bbP000000051e0e3P00000004124fP00000002bb" +
                "P000000051e0e3P000000013S007dupdate PONTO_VENDA    set VLR_LIMITE_CREDITO = VLR_LIMITE_CREDITO "
                + "- ? where COD_DISTRIBUIDOR = ?    and COD_PONTO_VENDA  = ? T03NIIP00000005100.3" +
                "P00000004124fP00000002bbXR0000124fXD00000000XN14MA_PCPDV_CONFIRMACAOF000bbe32";

        boolean c = true;
        
        while (c) {

            Pattern p = Pattern.compile("\\(\\?\\,[\\d,\\D]*[S,XU][0-9,a-f]*?"); //[0-9,a-f][0-9,a-f][0-9,a-f]?");
            Matcher m = p.matcher(texto);

            if (m.find()) {

                System.out.print("\nTEXTO ANTIGO\n\n" + texto + "\n\nFIM\n\n");

                texto = texto.replaceFirst("\\(\\?\\,[\\d,\\D]*[S,XU][0-9,a-f]*[0-9,a-f]", "\n");

            } else {
                System.out.println("Não achou\n");
                c = false;
            }

        }

        System.out.print("\n\nTEXTO FINAL\n\n" + texto + "\n\nFIM\n");
        System.exit(0);

    }

PS: eu sei... é um codigo fdp mesmo, rs

T

Pergunta - o que você quer fazer (ou seja, qual sua intenção?) Código com mais de 10 linhas nem olho :stuck_out_tongue:

Eu acho que é melhor você aprender direitinho expressões regulares. Vá para o site do Aurélio:

http://aurelio.net/er/

(Não precisa comprar nada porque a apostila também está na Internet).

aalvesii

Nó, foi mal, to c a cabeça ruim, nem disse o q eu queria.

entao, eu quero excluir todas as ocorrencias que começam com "(?, ?, ?.. ’ até antes da 1ª instrução ‘insert’ ou ‘update’.

De todo jeito vou dar uma olhada no livro sim, obrigado!

T

Podia pelo menos dizer como seria o valor desejado? Sou burro mesmo, preciso de um exemplo de saída.

aalvesii

Certo!

A saida que eu queria é tipo essa:

"[DSC_DADO]\nC00000f0fI000bbe32V0cSQLDP,V1.1.0XU0213insert into PEDIDO_COMPRA_PONTO_VENDA " +   
                "(COD_DISTRIBUIDOR, COD_PONTO_VENDA, COD_PEDIDO_COMPRA_PDV, DAT_SOLICITACAO, DAT_ATENDIMENTO, " +   
                "IND_SITUACAO, VLR_DESCONTO, VLR_ACRESCIMO, VLR_TOTAL, VLR_MARGEM, DSC_OBSERVACAO, " +   
                "DAT_ENTRADA_SINCR_ATEN, IND_SITUACAO_FINANCEIRO, COD_USUARIO, COD_SISTEMA, IND_TIPO_PEDIDO, " +   
                "DAT_ENVIO_DECISION, DAT_ENVIO_FILA_PROCESSAMENTO, IND_SOLICITACAO_CONFIRMA, " +   
                "COD_CONCENTRADOR_PDV_CELULAR, COD_CONDICAO_PAGAMENTO, COD_INTERFACE_ORIGEM) "+ 
   
               //a parte com (?, ?,... T16IIITTSNNNNSTSSSSTTSIIIP00000004124fP00000002bbP... sumiram da String
              "values " + "" + "insert "

               + "into ITEM_PED_COMPRA_PDV (COD_DISTRIBUIDOR, COD_PONTO_VENDA, COD_PEDIDO_COMPRA_PDV,"
                + " COD_IPED_COMPRA_PDV, COD_TIPO_VOUCHER, QTD_PEDIDA, VLR_ITEM, VLR_DESCONTO, VLR_MARGEM) "

                //nesse ponto também
                + "values " + "" + "update [/b]" +   

                "ITEM_EST_VOUCHER_DISTRIBUIDOR set COD_PONTO_VENDA = ?, COD_PEDIDO_COMPRA_PDV = ?, " +   
                "DAT_CONFIR_PED_PDV = ? where (COD_ITEM_ESTOQUE_VOUCHER = ?)T04IITIP00000002bbP000000051e0e3"   
                + "P0000000e20070706102602P0000000712b78c4P00000002bbP000000051e0e3P0000000e20070706102602" +   
                "P0000000712b78c5P00000002bbP000000051e0e3P0000000e20070706102602P0000000717636adP00000002bb" +   
                "P000000051e0e3P0000000e20070706102602P0000000717636aeP00000002bbP000000051e0e3" +   
                "P0000000e20070706102602P00000007178ee55P00000002bbP000000051e0e3P0000000e20070706102602" +   
                "P00000007178ee56P00000002bbP000000051e0e3P0000000e20070706102602P00000007178ee57P00000002bb"   
                + "P000000051e0e3P0000000e20070706102602P00000007178ee58P00000002bbP000000051e0e3" +   
                "P0000000e20070706102602P0000000717eafaaP00000002bbP000000051e0e3P0000000e20070706102602" +   
                "P0000000717eafabP00000002bbP000000051e0e3P0000000e20070706102602P0000000717eafacP00000002bb"   
                + "P000000051e0e3P0000000e20070706102602P0000000717eafadS0089 update ESTOQUE_VOUCHER_DISTRIBUIDOR"   
                + "set QTD_ESTOQUE = QTD_ESTOQUE - ?   where (COD_DISTRIBUIDOR = ?)     and (COD_TIPO_VOUCHER = ?)"   
                + "T03IIIP000000012P00000004124fP00000003bb9P000000014P00000004124fP00000004138aP000000014" +   
                "P00000004124fP000000042711P000000012P00000004124fP000000044e21S00a0update ITEM_PED_COMPRA_PDV "   
                +"set \nCOD_DISTRIBUIDOR = ?, \nCOD_PONTO_VENDA = ?, \nCOD_PEDIDO_COMPRA_PDV = ?\n where "   
                + "COD_DISTRIBUIDOR = ?\n and COD_PONTO_VENDA = ?\n and COD_PEDIDO_COMPRA_PDV = ?\n and " +   
                "COD_IPED_COMPRA_PDV = ?T07IIIIIIIP00000004124fP00000002bbP000000051e0e3P00000004124fP00000002bb"   
                + "P000000051e0e3P000000010P00000004124fP00000002bbP000000051e0e3P00000004124fP00000002bb" +   
                "P000000051e0e3P000000011P00000004124fP00000002bbP000000051e0e3P00000004124fP00000002bb" +   
                "P000000051e0e3P000000012P00000004124fP00000002bbP000000051e0e3P00000004124fP00000002bb" +   
                "P000000051e0e3P000000013S007dupdate PONTO_VENDA    set VLR_LIMITE_CREDITO = VLR_LIMITE_CREDITO "   
                + "- ? where COD_DISTRIBUIDOR = ?    and COD_PONTO_VENDA  = ? T03NIIP00000005100.3" +   
                "P00000004124fP00000002bbXR0000124fXD00000000XN14MA_PCPDV_CONFIRMACAOF000bbe32";

Deu pra entender mais ou menos? eu não quero os "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " +
"T16IIITTSNNNNSTSSSSTTSIIIP00000004124fP00000002bbP000000051e0e3P0000000e20070706102559" +
"P0000000a<*[NULL]*>P00000001AP000000030.0P000000030.0P00000005100.3P000000030.0" +
"P00000022Transação de Solicitação de PedidoP0000000a<*[NULL]*>P00000001AP00000000P00000007MIRVPDV"
+ "P00000001NP0000000a<*[NULL]*>P0000000a<*[NULL]*>P00000001AP000000010P00000001a" +
"P0000000a<*[NULL]*>XU00d5"
na saida... mas qdo eu faço o regex p o java tirar essas partes da String ele corta qse td!

aalvesii

Consegui resolver o problema, na verdade era até um pouco ‘simples’… (?!..rs)

o regex que deve ser usado é esse aqui

texto = texto.replaceFirst("\\([\\s\\,\\?]*\\)[\\d\\D&&[^\\?]]*[S,XU,XL][0-9a-f][0-9a-f][0-9a-f]?[0-9a-f]", "\n");

Mto obrigado pelo tempo e atenção de vcs.
Abraços.

Criado 16 de maio de 2008
Ultima resposta 19 de mai. de 2008
Respostas 8
Participantes 3