0

Muy buenas a todos.

Me explico, porque sé que no queda muy claro con el título. Imaginemos que yo tengo la siguiente cadena:

String cadena = "[1, 3, 6, 17][4,8, 16, 34][3, 16, 37, 41][10, 12, 26, 30]";

Ahora, imaginad que yo solo quiero coger lo que hay en el primer corchete, es decir, que me quedara una cosa así guardado en otro string:

String subCadena = "[1, 3, 6, 17]";

o esto:

String subCadena = "1, 3, 6, 17";

¿Podría realizarse algo parecido teniendo en cuenta, y esto es importante, que la longitud de esa sub-cadena que está entre corchetes puede variar, es decir, que lo mismo hay 4 números como hay 7? Lo mismo utilizando los corchetes como limitadores, como diciendo "solo quiero coger lo que hay entre estos dos primeros corchetes (incluidos o no, como sea más fácil).

Un saludo y gracias de antemano.

  • 1
    Nada es imposible. Pero te toca a ti intentarlo y si tienes algún problema lo dices y alguien te ayudará por aquí. – A. Cedano Jan 29 '20 at 18:38
  • Sí, precisamente por eso escribí aquí la pregunta. Ya había probado de todo dentro de mis conocimientos y no vi nada parecido en la red que puediera ayudarme con esta problemática en particular :) – Carlos Periañez Jan 30 '20 at 10:09

4 Answers4

1

Lo puedes hacer también con expresiones regulares que agrupen los valores entre [], por ejemplo:

    String cadena = "[1, 3, 6, 17][4,8, 16, 34][3, 16, 37, 41][10, 12, 26, 30]";
    Pattern p = Pattern.compile("\\[(.*?)\\]");
    Matcher m = p.matcher(cadena);
    /*find() alcanzará el primer grupo*/
    m.find();
    /*Si pones sólo group()  te lo devuelve con corchetes*/
    System.out.println(m.group());
    /*Si pones  group(indice)  te lo devuelve sin corchetes*/
    System.out.println(m.group(1));

Salida:

Cuando se usa group():

[1, 3, 6, 17]

Cuando se usa group(1):

1, 3, 6, 17

Si necesitaras mostrar todos los grupos, puedes abrir un bucle, por ejemplo:

    /*En caso de querer mostrar todos los grupos*/
    while(m.find())
    {
        System.out.println(m.group(1));
    }

Salida:

1, 3, 6, 17
4,8, 16, 34
3, 16, 37, 41
10, 12, 26, 30
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
0

Hola se me ocurre hacer esto.

uso substringpara obtener los valores que necesito, este substring necesita 2 parámetros el inicio y el fin, entonces uso indexOf para obtener la posición del primer corchete "[" que encuentre, luego uso nuevamente indexOf para encontrar el primer corchete "]" inverso. entonces con string corte de la posición del primer corchete "[" hasta la posición del primer corchete "]".

le sume uno porque no quiere obtener el primer corchete en mi string saludos.

te dejo el ejemplo

public static void main(String[] args) {

    String cadena = "[1, 3, 6, 17][4,8, 16, 34][3, 16, 37, 41][10, 12, 26, 30]";
    System.out.println("--> "+ cadena.indexOf("["));
    System.out.println("--> "+ cadena.indexOf("]"));
    System.out.println("--> "+ cadena.substring(cadena.indexOf("[")+1, cadena.indexOf("]")));
}
  • El defecto de como lo has hecho es que solo va a sacar el primer grupo. Faltaría meter el código en un bucle y que guarde cada grupo en un List – Cadeq Jan 30 '20 at 09:24
  • Sí, eso estaría bien pero tal y como lo ha puesto es lo que buscaba. En este caso el resto de grupos me da igual, solo me interesaba el primero. – Carlos Periañez Jan 30 '20 at 10:07
0

Te recomiendo que hagas un split() por el carácter ], que es el que indica que indica que una subcadena termina. Esto te genera un arreglo de todas las subcadenas.

Posteriormente haces substring(1) para no imprimir el [, ya que este carácter sigue presenta en la subcadena.

class Main {
  public static void main(String[] args) {
    String cadena = "[1, 3, 6, 17][4,8, 16, 34][3, 16, 37, 41][10, 12, 26, 30]";
    String [] split = cadena.split("]");
    System.out.println(split[0].substring(1));
    System.out.println(split[1].substring(1));
    System.out.println(split[2].substring(1));
  }
}

Salida al ejecutar el código:

1, 3, 6, 17
4,8, 16, 34
3, 16, 37, 41
FrEqDe
  • 3,516
  • 14
  • 42
  • 77
0

Puedes usar el método split(String regEx) este te permite dividir una cadena en base a una expresión regular definida. Ya que es una expresión regular puede ser simplemente una letra, coma, signo o algo más elaborado.

String cadena = "[1, 3, 6, 17][4,8, 16, 34][3, 16, 37, 41][10, 12, 26, 30]";
String[] resultadoSplit = cadena.split("\\]");

        for (int i = 0; i < resultadoSplit.length; i++) {
            System.out.println(resultadoSplit[i].substring(1));
        }

La salida:

1, 3, 6, 17
4,8, 16, 34
3, 16, 37, 41
10, 12, 26, 30

Utilizar un split te devuelve un String[], por eso utilizo el for para recorrer las posiciones fácilmente. Si tu quieres solo la primera deberás utilizarlo de la siguiente manera:

        String part1 = resultadoSplit[0]; // recuerda que en programación contamos desde 0
        part1 = part1.substring(1);
        System.out.println(part1);

Salida:

1, 3, 6, 17

En este caso se utiliza el substring para omitir el primer caracter, el cual seria [.

Te comparto Cómo separar un String en Java. Cómo utilizar split(), realmente te ayudara a comprender como funciona el método split().

YemisiSCG
  • 1,240
  • 6
  • 22