Quebrar uma string em partes e jogar o resultado para variavel

Preciso quebrar essa String

"service:jmx:rmi:///jndi/rmi://127.0.0.1:7001/jmxrmi" 

para pegar esse endereço ip e essa porta, e jogar cada um deles em uma variável diferente. Dei uma olhada por ai e vi que tem a função Split, só que não sei bem como usá-la. Outra coisa que complicou é que essa string não é um valor fixo, o ip e a port também podem mudar.

1 curtida

Isso resolve basicamente, mas, não se em relação a desempenho se é bom, um exemplo básico:

class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		String texto = "service:jmx:rmi:///jndi/rmi://127.0.0.1:7001/jmxrmi";
	    String[] textos = texto.split("//");
	    textos = textos[2].split("/");
	    textos = textos[0].split(":");
	    System.out.println(textos[0]);
	    System.out.println(textos[1]);
	}
}

ONLINE

onde nesse exemplo textos[0] é o ip e textos[1] é a port.

Então ai até resolveria o problema se fosse uma string fixa, mas como eu disse, essa string pode mudar de acordo com o ambiente, então se no meio da string acrescentar mais qualquer coisa que tenha outra “/” no meio já iria quebrar o código e o resultado não ia ser o correto.

Eu entendi que somente a porta e o ip mudariam, você precisa então colocar mais exemplos, tem como?

O exemplo que eu dei só resolva se a String for nesse esquema.

Poderia criar um regex com um grupo pro IP e e um grupo pra porta e aí usar as classes Pattern e `Matcher para extrair os valores do IP e porta.

Exemplo:

String text = "service:jmx:rmi:///jndi/rmi://127.0.0.1:7001/jmxrmi";

String ipGroup = "(\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3})";
String portGroup = "(\\d{1,5})";
String regex = ".+/" + ipGroup + ":" + portGroup + ".+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
    String ip = matcher.group(1);
    int port = Integer.parseInt(matcher.group(2));
    System.out.println("IP:   " + ip);
    System.out.println("Port: " + port);
}

Como você viu tem muitas formas de fazer isso.
Mas o importante é você saber o escopo e fazer um parser.
exemplo
“service:jmx:rmi:///jndi/rmi://127.0.0.1:7001/jmxrmi”
[service|work]<:><///></> …
Bom, apenas para entender, a linha acima tem [service|work] , nesse caso o parser espera pela palavra service ou a palavra work , se for diferente podera’ apresentar um erro.

Entendido isso, já pode começar a brincar.

import java.util.StringTokenizer;
 
public class PartString {
    
    public static void main(String[] args) {
       String s = "service:jmx:rmi:///jndi/rmi://127.0.0.1:7001/jmxrmi";
        
       // String s = "service:jmx:rmi:///jndi/rmi://www.salvejava.com.br:7001/jmxrmi";
        
        System.out.println("Por substring");
        int i = s.indexOf("jndi/rmi://");
        String p = s.substring(i+11, s.length() );
        String ip = p.substring(0, p.indexOf(":"));
        String port = p.substring(p.indexOf(":")+1, p.indexOf("/"));
        
        System.out.println("ip=" +  ip + " port="+port);
        
        
        System.out.println("\nPor StringTokenizer");
        StringTokenizer st = new StringTokenizer(s, ":/");
       
        while(st.hasMoreTokens()) {
            String ss = st.nextToken();            
            
            if(ss.equals("jndi") ) {
                String rmi = st.nextToken();
                if(rmi.equals("rmi") )  {
                   String ipp = st.nextToken();                    
                   String porta = st.nextToken();                    
                   
                   System.out.println( "ip=" + ipp );  
                   System.out.println( "porta=" + porta );  
                   break;
                }
            }
        }
          
    }
}