M.group() ? Como funciona

8 respostas
bruno_r_santana

Olá pessoal,

Dado o código:

import java.util.regex.*; class Regex2 { public static void main(String [] arg) { Pattern p = Pattern.compile(arg[0]); Matcher m = p.matcher(arg[1]); boolean b = false; while(b = m.find()) { System.out.print(m.start() + m.group()); } } }

e chamando pelo prompt assim:
java Regex2 “\d*” ab34ef

temos a saída:
01234456

Não entendi como funciona esse método group() e porque temos essa saída 01234456. Alguém poderia explicar com detalhes como funciona esse group e porque temos essa saída ai? Estou tentando entender mas não estou conseguindo.

até achei algumas coisas aqui mas não me ajudaram:
http://www.coderanch.com/t/531320/java/java/patterns-regex#2409330
http://www.coderanch.com/how-to/java/SCJP-FAQ#kb-regexp

valeu!

8 Respostas

E

Eu já vi esse código antes no GUJ, acredito que haja uma resposta adequada para essa questão.

EDIT - fui eu mesmo que respondi, veja minha resposta:

E

Eu já acho expressões regulares complicadas demais para criarem questões desse tipo “pegadinha”.

Não sei se caem questões tão bobas assim na prova, aliás.

bruno_r_santana

opa,

Já estou quase entendendo tudo. Só falta entender alguns detalhes. Mas veja essa saída que você colocou no outro post:

pos [0] ==> str []  
pos [1] ==> str []  
pos [2] ==> str [34]  
pos [4] ==> str []  
pos [5] ==> str []  
pos [6] ==> str []

pos 0 e 1 tem Strings vazias, ok.
pos 2 seria o número 3 e pos3 seria o número 4, porque ele deixou 34 na pos2 tudo junto?
Porque continuou com pos4 e pulou a pos3? E de onde vem essa pos6 ?

Se puderem me explicar esses detalhes eu agradeço.

Abraço.

E

\d* quer dizer “ZERO ou MAIS DÍGITOS”. Como ele é “guloso” ele tenta pegar o máximo de dígitos possíveis (nesse caso, ele bate com 34, não 3 e depois 4. )

Não é que ele “pulou a posição 3” e sim que “a posição 3 faz parte do que ele conseguiu bater”.

(Só para confundir mais ainda sua cabeça, a posição 3 contém o dígito 4 na expressão “ab34ef”.

Duvido muito que eu conseguisse acertar uma questão dessas em uma prova :frowning:

A posição 6 (que não existe na string, como você deve ter percebido) é a primeira depois do fim da string. Nesse caso, em que a expressão regular pode bater com uma coisa vazia, ocorreu isso.

De fato, eu mexo com expressões regulares há muito tempo, e nunca tinha pegado um caso tão bizarro quanto esse exercício, tanto é que eu tive de mudar o programa para poder entender o que ocorreu.

E

Acho que vou mudar um pouco a expressão, para você entender melhor. O exemplo do exercício é muito bizarro.

import java.util.regex.*;    
class Regex2 {    
    public static void main(String[] args) {    
        Pattern p = Pattern.compile("\\d+");
        //                     01234567890123456789012345678901234567
        Matcher m = p.matcher("O Brasil foi descoberto em 22/04/1500");  

  
        while(m.find()) {    
            System.out.println("pos [" + m.start() + "] ==> str [" + 

m.group() + "]");    
        }    
    }               
}

Saída:

pos [27] ==> str [22]
pos [30] ==> str [04]
pos [33] ==> str [1500]
bruno_r_santana

entanglement, agora entendi Muito obrigado.

E

Eu usei uma expressão regular que não bate com uma expressão vazia (sempre tem de ter pelo menos um dígito).

Você viu que em “O Brasil foi descoberto em 22/04/1500”, a expressão regular bate com “22”, “04” e “1500”, que começam respectivamente nas posições 27, 30 e 33. (A primeira posição é zero).

bruno_r_santana

Vi sim, até troquei por \\d* para entender a diferença. Agora ficou mais claro:

import java.util.regex.*;      
class Regex3 {      
    public static void main(String[] args) {      
        Pattern p = Pattern.compile("\\d*");  
        //                     01234567890123456789012345678901234567  
        Matcher m = p.matcher("O Brasil foi descoberto em 22/04/1500");    
  
    
        while(m.find()) {      
            System.out.println("pos [" + m.start() + "] ==> str [" +   
  
m.group() + "]");      
        }      
    }                 
}

valeu!

Criado 11 de junho de 2012
Ultima resposta 11 de jun. de 2012
Respostas 8
Participantes 2