Duvida ao fazer split..[RESOLVIDO]

37 respostas
R

Fala galera…blz??

seguinte, tenho uma string q vem no formato:

<a><li>Nome do aplicativo</li></a>

como eu poderia fazer split nessa string a fim de pegar apenas o Nome do aplicativo??
alguma ideia??

valew

37 Respostas

bandrade

pq vc nao faz um parser com expresão regular q retira todas as tags html??

R

hmm…algum exemplinho de parser?? :oops: :oops:

danieldestro

String pattern = “\<;li\>[\w]*\<\\li\>”;

Isso pegará “<li>qualquer frase</li>”.

R

danieldestro:
String pattern = “&;lt;li&gt;[\w]*<\li>”;

Isso pegará “

  • qualquer frase
  • ”.

    valew destro, mas nao entendi como usar essa String de patterns…

    more details, please??

    thanx

    NoodleZ
    Pattern.matches ("String pattern do danielDestro", "String a ser testada");
    

    retorna true ow false de acordo com o que voce passa.

    dá pra ser usada tb em

    String.replaceAll ("String pattern do danielDestro",  "String a ser usada")
    
    danieldestro

    There you go: http://java.sun.com/docs/books/tutorial/extra/regex/

    bandrade

    ai, ai… expressão regular é lindo… ((;
    parabéns ao cara que pensou nisso… ((;

    Fabricio_Cozer_Marti

    hehehehe
    sem exageros meu caro bandrade, já vi muitos códigos ilegiveis e cada expressao regular de dar medo.
    nesse caso é útil,
    agora pq esse tópico está em off-topic ?

    R

    nossa…

    o tico-e-teco aki hj tao devagar…

    destro, essa string q vc passou nem compilou no meu codigo…

    valew

    danieldestro

    É que eu nunca sou bom em lembrar exatamente a sintaxe correta dos patterns. Mas dá uma lida no link que te passe que você vai ver que é fácil.

    Eu arrumei o pattern.

    R

    nada feito ainda…

    to fazendo assim:

    String teste = new String("<li><a>Teste</a></li>");
    		Pattern p = Pattern.compile("\<li\><a\>[\w]*\<\\a\><\\li\>");
    		String[] a = p.split(teste);
    		for (int i=0; i<a.length; i++)
    		{
    				System.out.println(a[i]);
    		}
    

    e ele imprime exatamente a mesma String original…

    valew>

    danieldestro

    CLARO
    Isso quer dizer que está SIM funcionando. O seu pattern pega justamente o que pediu.

    R

    hmm…

    entao ele vai pegar o q eu passar no compile(), eh isso??
    nao kero q ele pegue as tags HTML…apenas o texto dentro delas…

    valew

    bandrade

    coloca assim (\<li\><a\>)([\w]*)(\<\\a\><\\li\>)
    e manda pegar o que der match apenas com a 2a parte da sua expressao… nesse caso o 2o parenteses.

    T

    Una preguntita … se essa string não fosse tão pequena não daria para usar um XML parser ? :wink:
    Logo vocês estão rindo porque um XML Parser é uma coisa grande demais para efetuar o parse de uma string tão simples.
    Mas é isso que mata no XML.
    Mesmo usar o DOM4J (que é uma API bastante simples) já é meio pesado.

    R

    galera, ainda nao consegui fazer esse pattern funcionar como deveria…

    alguem pode dar uma ajuda mais pratica??

    valew

    danieldestro

    Você ao menos leu o tutorial sobre Regexp que te passei?

    T

    Matando mosquito com canhão, parte 1

    import java.util.regex.*;
    
    class TestParse {
        public static void main(String[] args) {
            String str = "<a><li>Nome do aplicativo</li></a>";
            Pattern pat = Pattern.compile ("<a><li>([^<]+)</li></a>");
            Matcher mat = pat.matcher (str);
            if (mat.matches()) {
                System.out.println (mat.group(1));
            }
        }
    }
    
    R

    eu li sim, destro…mas concorda q aprender regular expressions em 1/2 hora eh meio complicado?? tenho q fazer isso funcionar logo…

    valew

    R

    thingol:
    Matando mosquito com canhão, parte 1

    import java.util.regex.*;
    
    class TestParse {
        public static void main(String[] args) {
            String str = "<a><li>Nome do aplicativo</li></a>";
            Pattern pat = Pattern.compile ("<a><li>([^<]+)</li></a>");
            Matcher mat = pat.matcher (str);
            if (mat.matches()) {
                System.out.println (mat.group(1));
            }
        }
    }
    

    valew thingol…
    mas uma duvida…se a tag “” vier com algum atributo, ele funciona tb??

    valew

    danieldestro

    Ai não funfa. Nem com espaços. Você tem q criar uma regexp que assuma isso.

    T

    Que tal usar o DOM4J?
    Eu sei que é matar mosquito com canhão, parte 2, mas aí já leva em conta todas essas particularidades (como atributos etc.)

    R

    thingol:
    Que tal usar o DOM4J?
    Eu sei que é matar mosquito com canhão, parte 2, mas aí já leva em conta todas essas particularidades (como atributos etc.)

    talvez resolva de vez isso…

    como ele funfa, please?

    danieldestro

    Funfa com HTML mal formatado?

    T

    HTML mal formatado? Não senhor. Para tais monstros é melhor usar um parser HTML mesmo.

    danieldestro

    Eu ficaria com regexp mesmo.

    T

    Então vamos lá, regexp parte 2 - matando mosquito com canhão, agora com mira a laser

    import java.util.regex.*;
    
    class TestParse {
        public static void main(String[] args) {
            String str = "<a href='http://java.sun.com'><li class=\"itemClass\">Nome do aplicativo</li></a>";
            Pattern pat = Pattern.compile ("<li[^>]*>([^<]+)</li>", Pattern.CASE_INSENSITIVE);
            Matcher mat = pat.matcher (str);
            if (mat.find()) {
                System.out.println (mat.group(1));
            } else {
                System.out.println ("nao bate");
            }
        }
    }
    
    T

    A expressão regular para remover os atributos está errada, eu sei, porque se houver algum “>” dentro de um atributo, vai dar problemas. Mas se nunca houver “>” dentro de atributos acho que dá para encarar. (A expressão correta seria bem mais complicada)

    <li[^>]*>([^<]+)</li>
    
    T

    Isso já parece conversa de programador Perl, daqui a pouco vai entrar um expert Perl em regexps nessa história toda…

    sergiolopes

    impressao minha ou esse negocio de usar regexp pode falhar no caso de atributos bizarros do tipo:

  • bizarro2
  • sergiolopes

    thingol:
    A expressão regular para remover os atributos está errada, eu sei, porque se houver algum “>” dentro de um atributo, vai dar problemas. Mas se nunca houver “>” dentro de atributos acho que dá para encarar. (A expressão correta seria bem mais complicada)

    <li[^>]*>([^<]+)</li>

    eh justamente o q eu tinha perguntado acima hehehe
    melhor um parser xml mesmo

    danieldestro

    Mas usando algo que pega todos os caracteres até achar “>” (non Greedy) funciona na boa.
    Já fiz isso.

    NoodleZ
    string.replaceAll("<a><li>", " ");
    string.replaceAll("</li></a>", " ");
    

    resolvido :smiley: :smiley: 8)

    danieldestro

    NoodleZ:
    string.replaceAll("<a><li>", " "); string.replaceAll("</li></a>", " ");

    resolvido :smiley: :smiley: 8)

    Vai além disso.

    bandrade

    puts… replace não…
    me explica… pra que vc coloca uma tag dentro de uma propriedade??

    vai por “<.*>”

    dah um replace usando expressao regular, substitui “<.*?>” por “”
    resolve seu prblema.

    R

    danieldestro:
    NoodleZ:
    string.replaceAll("<a><li>", " "); string.replaceAll("</li></a>", " ");

    resolvido :smiley: :smiley: 8)

    Vai além disso.

    exato…resolvi o problema desse modo…

    portletName = portletName.replaceAll("</","><");
    portletName = portletName.replaceAll("<li([^>]+)?><a([^>]+)?>"," ");
    portletName = portletName.replaceAll("<a><li>"," ");
    

    valew pela forca…

    bandrade

    nusga… 3 replaces…

    Criado 11 de julho de 2005
    Ultima resposta 12 de jul. de 2005
    Respostas 37
    Participantes 7