2011-04-07 12 views
10

¿Alguien podría ayudarme con algunas expresiones regulares?División de una cadena usando Regex en Java

que quieren dividir la siguiente cadena en un número, número de cuerda

"810LN15"

1 810 método requiere que se devuelva, otro requiere LN y el otro debe volver 15.

La única verdadera La solución a esto es usar regex a medida que los números crecerán en longitud

¿Qué expresión regular puedo usar para acomodar esto?

+0

Tu pregunta no esta clara. ¿Quieres dividir en "LN", o en cualquier secuencia alfabética? –

+0

Hola Laurent. En diferentes métodos, necesito obtener una parte diferente de esta cadena, 1 método requiere que se devuelva 810, otro requiere LN y el último requiere 15. No quiero ir por la ruta de usar subcadenas y conteos de cuerdas como las longitudes de la cadena. los números pueden cambiar. Su ayuda es muy apreciada con este – Damien

Respuesta

16

String.split no le dará el resultado deseado, que supongo que sería "810", "LN", "15", ya que tendría que buscar un token para dividir y tiraría ese token.

Trate Pattern y Matcher lugar, el uso de esta expresión regular: (\d+)|([a-zA-Z]+), lo que se correspondería con cualquier secuencia de números y letras y obtener grupos de número/texto distintos (es decir, "AA810LN15QQ12345" daría lugar a los grupos "AA", "810", "LN", "15", "QQ" y "12345").

Ejemplo:

Pattern p = Pattern.compile("(\\d+)|([a-zA-Z]+)"); 
Matcher m = p.matcher("810LN15"); 
List<String> tokens = new LinkedList<String>(); 
while(m.find()) 
{ 
    String token = m.group(1); //group 0 is always the entire match 
    tokens.add(token); 
} 
//now iterate through 'tokens' and check whether you have a number or text 
+0

Hola Thomas, muchas gracias por su contribución, mi problema ahora está resuelto – Damien

7

(\\d+)([a-zA-Z]+)(\\d+) debe hacer el truco. El primer grupo de captura será el primer número, el segundo grupo de captura será las letras intermedias y el tercer grupo de captura será el segundo número. Las barras invertidas dobles son para Java.

+0

Muchas gracias por su entrada Mark, me ayudó a resolver mi problema – Damien

10

En Java, como en la mayoría de los sabores de expresiones regulares (Python siendo una notable excepción), no se requiere la expresión regular split()-consumen cualquier carácter cuando se encuentra una coincidencia. Aquí he utilizado los símbolos de anticipación y lookbehinds para adaptarse a cualquier posición que tiene un dígito de un lado y un no-dígitos en el otro:

String source = "810LN15"; 
String[] parts = source.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)"); 
System.out.println(Arrays.toString(parts)); 

de salida:

[810, LN, 15] 
0

Esto le da la exacta Lo que ustedes están buscando

 Pattern p = Pattern.compile("(([a-zA-Z]+)|(\\d+))|((\\d+)|([a-zA-Z]+))"); 
     Matcher m = p.matcher("810LN15"); 
     List<Object> tokens = new LinkedList<Object>(); 
     while(m.find()) 
     { 
      String token = m.group(1); 
      tokens.add(token); 
     } 
     System.out.println(tokens); 
Cuestiones relacionadas