Regex - resposta estranha do livro

3 respostas
A

Tem uma questão bem similar a esta no livro da kathy (pág 286, 2 edição) que embaralhou tudo que eu achava que sabia:

import java.util.regex.*;

class Regex2 {

   public static void main(String[] args) {
     Pattern p = Pattern.compile(args[0]);
     Matcher m = p.matcher(args[1]);
     boolean b = false;
     while(b = m.find()){
     System.out.print(m.start() +  m.group());
   }

}

linha de comando: java Regex2 "\d*" ab34ef

Resposta: letra E : 01234456

Se alguém por favor puder dar uma luz! Par mim não faz o menor sentido a resposta!

Obrigada :)
Ariane.

3 Respostas

L

Bem, não sou um expert em regex ahahaha e para eu te dar uma explicação convincente vou ter que ler sobre regex e os métodos de matcher de novo (faz tempo que não vejo isso).
Mas ai a grande pegadinha tá que ele imprime o método start, da uma olhada nesses dois tópicos, ve se ajuda:

http://forum.java.sun.com/thread.jspa?messageID=10016161
http://forum.java.sun.com/thread.jspa?messageID=9813530

A

Agora foi... entendi. Dei uma mexidinha no código para ele dar uma resposta mais legível:

import java.util.regex.*;
class Regex {
    
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d*");
        Matcher m = p.matcher("ab34ef");
        boolean b = false;
        while(b = m.find()) {
            System.out.print("index:"+m.start()+":");
            System.out.println("group:"+m.group()+":");
        }
    }
    
}

e o resultado foi:

index:0:group::
index:1:group::
index:2:group:34:
index:4:group::
index:5:group::
index:6:group::

Portanto o que dá prar concluir é que de fato ele retorna Strings vazias ou dígitos, por causa do * que representa zero ou mais. Tanto é que se você trocar o regex de "\\d*" para "\\d+" (+ é um ou mais) vai retornar:

index:2:group:34:

A única coisa estranha mesmo é o porque da linha "index:6:group::", de onde ele tirou esta posição 6 que não existe? A única explicação que eu vi nestes foruns é que ele considera o nada depois do 'f'. O que é meio esquisitinho mas... tem coisas que a gente entende, tem coisas que a gente aceita não mesmo?

L

hehehe sabe que eu nem tinha me ligado nisso, que com d* ele retorna os vazios e d+ não… eu rodei o código aqui e pensei: “ow, um branco, bah faz tanto tempo que não leio sobre isso, deve ter lógica” hehe
mas pois é, minha ignorância nesse assunto é visível hehe e não sei te dizer porque da linha 6, se achar algo posto aqui

Criado 12 de janeiro de 2008
Ultima resposta 14 de jan. de 2008
Respostas 3
Participantes 2