2012-09-26 17 views
47

tengo una cadena,¿Cómo obtener una cadena entre dos caracteres?

String s = "test string (67)"; 

que desea obtener el nº 67 que es la cadena entre (y).

¿Alguien puede decirme cómo hacerlo?

+1

Hay varias maneras - se podía repetir los caracteres en la cadena hasta llegar a la '(' o encontrar el índice del primer '(' y ')' y hágalo con subcadena o, lo que la mayoría de la gente haría, use una expresión regular. –

Respuesta

0

La manera "genérica" ​​de hacerlo es analizar la cadena desde el principio, tirando todos los caracteres antes del primer corchete, grabando los caracteres después del primer corchete y tirando los caracteres después del segundo corchete.

Estoy seguro de que hay una biblioteca de expresiones regulares o algo para hacerlo.

+0

Java soporta expresiones regulares. No necesita una biblioteca regexp4j;) –

61

Probablemente hay una expresión regular muy ordenado, pero soy novato en esa zona, así que en vez ...

String s = "test string (67)"; 

s = s.substring(s.indexOf("(") + 1); 
s = s.substring(0, s.indexOf(")")); 

System.out.println(s); 
+2

Sin pasar por las rarezas de análisis regex, creo que esta es la mejor manera de extraer la cadena requerida. – verisimilitude

+3

regex es mucho más poderoso y puede admitir más casos, pero para simplificar, esto funciona ... – MadProgrammer

+1

En serio, ¿por qué esto atraerá un voto a la baja? ¿No funciona? ¿No responde la pregunta de operaciones? – MadProgrammer

6
String s = "test string (67)"; 

int start = 0; // '(' position in string 
int end = 0; // ')' position in string 
for(int i = 0; i < s.length(); i++) { 
    if(s.charAt(i) == '(') // Looking for '(' position in string 
     start = i; 
    else if(s.charAt(i) == ')') // Looking for ')' position in string 
     end = i; 
} 
String number = s.substring(start+1, end); // you take value between start and end 
+0

¿Podría incluir una breve explicación del código? –

+1

@ N.N. He dado más comentarios para el código –

2

Otra forma de hacerlo utilizando el método de división

public static void main(String[] args) { 


    String s = "test string (67)"; 
    String[] ss; 
    ss= s.split("\\("); 
    ss = ss[1].split("\\)"); 

    System.out.println(ss[0]); 
} 
12

Java supports Regular Expressions , pero son un poco engorrosos si realmente quieres usarlos para extraer coincidencias. Creo que la forma más fácil de llegar a la cadena que desea en su ejemplo es que sólo tiene que utilizar el soporte de expresiones regulares en replaceAll método de la clase String:

String x = "test string (67)".replaceAll(".*\\(|\\).*", ""); 
// x is now the String "67" 

Esto simplemente borra todo hasta al e-incluyendo la primera (, y lo mismo para el ) y todo lo demás. Esto simplemente deja el material entre paréntesis. Sin embargo, el resultado sigue siendo String. Si quieres un resultado entero entonces que hay que hacer otra conversión:

int n = Integer.parseInt(x); 
// n is now the integer 67 
19

Mediante el uso de expresiones regulares:

String s = "test string (67)"; 
Pattern p = Pattern.compile("\\(.*?\\)"); 
Matcher m = p.matcher(s); 
if(m.find()) 
    System.out.println(m.group().subSequence(1, m.group().length()-1)); 
+1

Creo que deberías hacer de esto un juego no codicioso usando ". *?" en lugar. De lo contrario, si la cadena es algo así como "cadena de prueba (67) y (68), esto devolverá" 67) y (68 ". –

+0

de acuerdo. Agregó"? ". –

2

Uso Pattern and Matcher

public class Chk { 

    public static void main(String[] args) { 

     String s = "test string (67)"; 
     ArrayList<String> arL = new ArrayList<String>(); 
     ArrayList<String> inL = new ArrayList<String>(); 

     Pattern pat = Pattern.compile("\\(\\w+\\)"); 
     Matcher mat = pat.matcher(s); 

     while (mat.find()) { 

      arL.add(mat.group()); 
      System.out.println(mat.group()); 

     } 

     for (String sx : arL) { 

      Pattern p = Pattern.compile("(\\w+)"); 
      Matcher m = p.matcher(sx); 

      while (m.find()) { 

       inL.add(m.group()); 
       System.out.println(m.group()); 
      } 
     } 

     System.out.println(inL); 

    } 

} 
+0

nombrar nombres de variables podría hacer que el método sea más amistoso – Zon

41

Tratar como este

String s="test string(67)"; 
String requiredString = s.substring(s.indexOf("(") + 1, s.indexOf(")")); 

La firma del método para la subcadena es:

s.substring(int start, int end); 
+5

substring .no camelCase. – ssayyed

+0

no funcionará si tiene algo como "prueba" string (67) ". – user2871190

-1

Recibí la respuesta de esta manera. Pruébalo

String value = "test string (67)"; 
int intValue =Integer.valueOf(value.replaceAll("[^0-9]", "")); 
8

En una sola línea, sugiero:

String input = "test string (67)"; 
input = input.subString(input.indexOf("(")+1, input.lastIndexOf(")")); 
System.out.println(input);` 
0
String s = "test string (67)"; 

System.out.println(s.substring(s.indexOf("(")+1,s.indexOf(")"))); 
1

usted podría utilizar StringUtils Apache de la biblioteca común de hacer esto.

import org.apache.commons.lang3.StringUtils; 
... 
String s = "test string (67)"; 
s = StringUtils.substringBetween(s, "(", ")"); 
.... 
23

Una solución muy útil para este problema, que no requiere de usted para hacer el indexOf está utilizando Apache Commons bibliotecas.

StringUtils.substringBetween(s, "(", ")"); 

Este método le permitirá manejar incluso aunque haya múltiples apariciones de la cadena de cierre que no será fácil mediante la búsqueda de la cadena de cierre indexOf.

Puede descargar esta biblioteca desde aquí: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

2

La manera más genérica que encontré para hacer esto con expresiones regulares y clases de patrones/Matcher:

String text = "test string (67)"; 

String START = "\\("; // A literal "(" character in regex 
String END = "\\)"; // A literal ")" character in regex 

// Captures the word(s) between the above two character(s) 
String pattern = START + "(\w+)" + END; 

Pattern pattern = Pattern.compile(pattern); 
Matcher matcher = pattern.matcher(text); 

while(matcher.find()) { 
    System.out.println(matcher.group() 
     .replace(START, "").replace(END, "")); 
} 

Esto puede ayudar a los problemas de expresiones regulares más complejas donde desea obtener el texto entre dos conjuntos de caracteres.

2
String result = s.substring(s.indexOf("(") + 1, s.indexOf(")")); 
+0

Por favor, formatee su código sangríando 4 espacios. También rellenaré su respuesta un poco explicándole qué hace su código para aquellos que visitan que no están seguros de lo que '.substring' y .indexOf' hacen. – Bugs

0

La otra solución posible es utilizar lastIndexOf donde buscará carácter o cadena de atrás.

En mi caso, yo había String siguiente y tuve que extraer <<UserName>>

1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc 

Así, indexOf y StringUtils.substringBetween No fue útil, ya que comienzan a buscar el carácter de principio.

Por lo tanto, he usado lastIndexOf

String str = "1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc"; 
String userName = str.substring(str.lastIndexOf("_") + 1, str.lastIndexOf(".")); 

Y, me da

<<UserName>> 
Cuestiones relacionadas