¿Cómo usar subcadenas e indexOf para una cadena con caracteres repetidos?

Tengo la siguiente String myString="city(Denver) AND state(Colorado)"; Se ha repetido “(” y “)” …

¿Cómo puedo recuperar el nombre del estado, es decir, Colorado. Intenté lo siguiente:

 String state = myString.substring(myString.indexOf("state(")+1,myString.indexOf(")")); 

Pero da indexOutOfBoundException

¿Hay alguna forma de especificar que necesito el segundo “(” en myString? Necesito el resultado: String state = "Colorado";

Utilice lastIndexOf . También aumente el desplazamiento inicial para permitir el número de caracteres en el state( subcadena state( :

 String state = myString.substring(myString.indexOf("state(") + 6, myString.lastIndexOf(")")); 

Puedes usar Regex.

 Matcher matcher = Pattern.compile("(state)(\(.*?\))").matcher(text); String state = matcher.group(2); 

Puedes cortar la cuerda y hacerlo en una pieza de sanbox. De esta manera si hay más “…” no pasa nada malo.

 String state = myString.substring(myString.indexOf("state(")+6); state = state.substring(0,state.indexOf(")")); 

Puede usar otra versión de String # indexOf (String str, int fromIndex) para especificar desde qué posición le gustaría comenzar a buscar ")" .

 int start = myString.indexOf("state(")+6;//6 is the length of "state(" - we dont want that part int end = myString.indexOf(")", start); String state = myString.substring(start, end); 

Su problema es que la primera aparición de ")" es anterior a la aparición de "state(" como aparece también después de Denver .

Si necesita el último índice, puede usar lastIndexOf() , tanto para "(" como para ")" . Si necesita precisamente la segunda aparición, puede usar la versión de indexOf() que le permite especificar un índice donde comenzar la búsqueda, y establecer que el índice sea el que está después de la primera aparición de su char, como esto:

  int firstOpenP = myString.indexOf("("); int firstClosedP = myString.indexOf(")"); int secondOpenP = myString.indexOf("(", firstOpenP + 1); int secondClosedP = myString.indexOf(")", firstClosedP + 1); String state = myString.substring(secondOpenP + 1, secondClosedP);