Dúvidas no uso do método Split de java.lang.String;

5 respostas
M
Estou com dúvidas no uso do método split de uma string. Pelo que li, ele retorna um array de strings baseado na divisão da própria pela string passada como parâmetro:


  public String[] split(String regex).


Mas não consigo pôr isso pra funcionar, vejam o que faço:





  


  String lineRegister = "Fernando|Martines|java";


  String[] fields = lineRegister.split("|");


  


 <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pngtuck_out_tongue.png?v=9" title=":stuck_out_tongue:" class="emoji" alt=":stuck_out_tongue:">





  pensei que retornasse:


  fields[0] = "Fernando";


  fields[1] = "Martines";


  fields[2] = "java";


 :-o





Mas isso não acontece!!! quando peço para imprimir:


  System.out.print( fields[1] );


  System.out.print( " adora " );


  System.out.print( fields[2] );


era pra imprimir:





sonho:


  "martines adora java"





realidade:


  "f adora e"


 :-[





O que há de errado?


Será que é o Pipeline que não pode ser usado? Se sim pq? Será que é por causa do UNIX???





Agradeço o emprenho de todos.





[]´s

5 Respostas

B
Martines,





Você não pode usar o pipeline, independentemente do SO.





Por que? Bom,  que você insiste em saber, aqui vai a explicação





O método split da classe String na verdade utiliza o split da Pattern, que é parte do pacote de expressões regulares, da seguinte forma:





    public String[] split(String regex, int limit) {


	return Pattern.compile(regex).split(this, limit);


    }





Este método compile é o que realmente cria o objeto Pattern, que será utilizado internamente, e inicia o seu parsing através do método expr. O expr vai fazendo um loop para criar objetos Node através do método sequence. É neste sequence que está o problema! Ele tem outro loop, que vai passando caracter a caracter para testar se o caracter seguinte seria o delimitador, mas ao mesmo tempo checa se é algum caracter especial de regexp, tais como *, ?, +, $, etc. O | é um deles, e no caso, ele apenas faz um break no loop, pois é considerado internamente como caracter delimitador. Então, para cada caracter ele acaba retornando um Node, e assim na array cada posição fica com um caracter da String.
M

Obrigado pelos esclarecimentos!



[]´s



:slight_smile: Fernando Martines

P

Oi,



Houve um engano aí… pode ser usado o pipe ("|") pra separar sim. É verdade o que foi dito, que uma expressão regular é usada, mas para resolver o problema e fazer a classe String interpretar corretamente o pipe, basta "quotá-lo" com o caractere "". Se você colocasse "|" apenas, não daria certo, porque estaria quotando o próprio caractere "|" e aconteceria o mesmo; o que você tem que usar é "|" - uma contrabarra pra quotar a segunda contrabarra, de modo que o interpretador de expressões regulares receberá o caractere ´´ seguido do ´|´ e assim interpretará o "|" como um pipe quotado… Ufa! Complicadinho, né?



Use minhastring.split("|") que dá certo do jeito que você queria.

B

Realmente eu não havia pensado nesta hipótese!



Só para esclarecer seu exemplo, já que umas barrinhas andaram sumindo da mensagem, então fica:



minhastring.split("\|");

A
Quote:


06/01/2003 ás 18:53, Patola wrote:

Ufa! Complicadinho, né?



Use minhastring.split("|") que dá certo do jeito que você queria.




Talvez sim talvez não, é só darmos uma olhadinha nos caracteres meta-dados das er´s :slight_smile:

http://guia-er.sourceforge.net/



[]´s

Dalton
Criado 4 de janeiro de 2003
Ultima resposta 7 de jan. de 2003
Respostas 5
Participantes 4