2012-03-17 12 views
5

Quiero dividir cadenas en forma de EADGBE o DADF # AD en cadenas separadas, cada una con una letra o una letra más un signo #. ¿Hay alguna manera más elegante que iterar a través de la cadena con un enfoque de fuerza bruta?¿Cuál es una buena manera de dividir una cadena no delimitada en Java?

String.split obviamente se basa en delimitadores, que luego se descartan, lo cual no me sirve para nada - durante un par de minutos pensé que split("[a-gA-G]#?"); iba a funcionar, pero no, eso no ayuda a todo, casi quiero lo opuesto a eso ...

+0

¿Puedes dar un ejemplo de una cadena que quieras dividir? – chandsie

+0

Me temo que tendrás que ir por el método de la fuerza bruta – mac

+0

Esto es trivial. Ve por la fuerza bruta. No agregue complejidad y vistas generales de una expresión regular. –

Respuesta

3

Es probable que la fuerza bruta sea tu mejor opción, tanto en términos de código como de rendimiento.

Alternativamente, se puede utilizar un Matcher

Pattern p = Pattern.compile("[a-gA-G]#?"); 
Matcher m = p.march(inputString); 
List<String> matches = new ArrayList<String>(); 
while(m.find()) 
    matches.add(m.group()); 
+0

¡Ah, muy bien - ninguno de mis Google descubrió nada sobre Matchers! Gracias por eso. :) – Oolong

1

Si FORSEE cambios en el patrón se puede utilizar:

String s = "DADF#AD"; 
    Pattern p = Pattern.compile("([a-gA-G]#?)"); 
    Matcher matcher = p.matcher(s); 
    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 
1

Usando búsqueda hacia delante y de búsqueda hacia atrás funciona: String regex = "(?<=.)(?=\\w#?)";

por ejemplo,

import java.util.Arrays; 

public class Foo { 
    public static void main(String[] args) { 
     String[] tests = {"EADGBE", "DADF#AD"}; 
     String regex = "(?<=.)(?=\\w#?)"; 
     for (String test : tests) { 
     System.out.println(Arrays.toString(test.split(regex))); 
     } 
    } 
} 

devuelve:

[E, A, D, G, B, E]
[D, A, D, F #, A, D]

+0

'String regex =" (? = (?! ^) \\ w #?) ";', Ahí lo tiene. –

+0

@refp: eso parece funcionar también, lo que evita que se capture el inicio de línea. Slick y gracias! –

+0

Ah ... ¡No sabía que era una opción! Tal vez no sea la técnica más amigable para los humanos, o tal vez realmente me refiero al amigable para principiantes, pero definitivamente es bueno ser consciente de que esto es algo que puedes hacer con expresiones regulares en Java. ¡Gracias! – Oolong

0

¿Qué tal que: Agregar delimitadores, entonces dividida:

Este método añade delimitadores

private static String delimit(String in) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < in.length()-1; i++) { 
    sb.append(in.charAt(i)); 
    if (in.charAt(i+1) != '#') 
     sb.append(';'); 
    } 
    return sb.toString(); 
} 

utilizarlo:

String[] notes = delimit("DADF#AD").split(";"); 
+0

¿Por qué no utilizar el bucle for para generar una lista de tokens en lugar de construir una cadena intermedia innecesaria? – Dunes

+0

@Dunes Ya he publicado docenas de esas soluciones estándar en SO, solo quería hacer algo diferente;) –

+0

¡je! Supongo que eso funcionaría, sí. Me pregunté sobre la inserción de delimitadores, pero pensé que tenía que haber una manera más simple ... que, como han señalado otros usuarios, ¡sí existe! Pero gracias en cualquier caso, es saludable estar al tanto de las alternativas ... – Oolong

Cuestiones relacionadas