2010-09-20 170 views

Respuesta

88

Es posible utilizar una expresión regular con la anchura de cero búsqueda positiva hacia delante - se encuentra letras mayúsculas, pero no los incluye en delimitador:

String s = "thisIsMyString"; 
String[] r = s.split("(?=\\p{Upper})"); 

Y(?=X) partidos Y seguido por X, pero no incluye en X partido. De modo que (?=\\p{Upper}) coincide con una secuencia vacía seguida de una letra mayúscula, y split la usa como delimitador.

Consulte javadoc para obtener más información sobre la sintaxis de expresiones regulares de Java.

EDITAR: Por cierto, tampoco funciona con thisIsMyÜberString. Para letras mayúsculas no ASCII que necesita una clase de caracteres en mayúscula Unicode en lugar de POSIX uno:

String[] r = s.split("(?=\\p{Lu})"); 
+2

+1, que fueron los primeros (por unos pocos segundos), + explicación, + la clase alta predefinido :) – Bozho

+1

Sólo ten en cuenta que si el carácter superior es el último de la cadena que no recibirá un str vacío para el bit más allá, por ejemplo dividir "H2W" devolverá {"", "2"} donde "" es el bit antes de "H", y "2" es el bit en el medio. Normalmente no es un problema, pero puede romper suposiciones sobre cuántas partes se devuelven. – locka

+0

@locka: ¿Hay alguna forma de evitar eso que no sea la comprobación explícita? – Jeremy

16
String[] camelCaseWords = s.split("(?=[A-Z])"); 
+1

No funciona para "thisIsMyÜberString". – jarnbjo

+1

axtavt ya dio una respuesta correcta a la pregunta de Guido, ¿por qué responder dos veces? Tu respuesta es incorrecta, así que la rechacé y señalé por qué. – jarnbjo

+0

@jarnbjo su respuesta inicialmente no funcionó para umlaut. – Bozho

5

Desde String::split toma una expresión regular puede utilizar un preanálisis:

String[] x = "thisIsMyString".split("(?=[A-Z])"); 
0

Try esta;

static Pattern p = Pattern.compile("(?=\\p{Lu})"); 
String[] s1 = p.split("thisIsMyFirstString"); 
String[] s2 = p.split("thisIsMySecondString"); 

... 
10

Para cualquiera que se pregunta cómo el patrón es cuando la cadena para dividir podría comenzar con un carácter en mayúsculas:

String s = "ThisIsMyString"; 
String[] r = s.split("(?<=.)(?=\\p{Lu})"); 
System.out.println(Arrays.toString(r)); 

da: [Esto, es, mi, String]

+0

Esto es ** no ** una respuesta a la pregunta original.Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/whats-reputation) lo hará poder [comentar cualquier publicación] (http://stackoverflow.com/help/privileges/comment). – DavidPostill

+0

¡Gracias por la adición! – serj

0

Esta expresión regular se dividirá en mayúsculas, omitiendo la primera. Por lo tanto, debería funcionar para camel-case y proper-case.

(?<=.)(?=(\\p{Upper})) 

TestText = Test, Text 
thisIsATest = this, Is, A, Test 
Cuestiones relacionadas