La mejor manera de especificar espacios en blanco en una operación String.Split

Resuelto asked hace 13 años • 12 respuestas

Estoy dividiendo una cadena según los espacios en blanco de la siguiente manera:

string myStr = "The quick brown fox jumps over the lazy dog";

char[] whitespace = new char[] { ' ', '\t' };
string[] ssizes = myStr.Split(whitespace);

Es molesto definir la matriz char[] en todas partes de mi código. Quiero hacer esto. ¿Existe una forma más eficiente que no requiera la creación de la matriz de caracteres (que es propensa a errores si se copia en diferentes lugares)?

 avatar May 24 '11 20:05
Aceptado

Si solo llamas:

string[] ssize = myStr.Split(null); //Or myStr.Split()

o:

string[] ssize = myStr.Split(new char[0]);

entonces se supone que el espacio en blanco es el carácter de división. Desde la string.Split(char[])página de documentación del método .

Si el parámetro separador nullno contiene caracteres, se supone que los espacios en blanco son los delimitadores. Los caracteres de espacio en blanco están definidos por el estándar Unicode y regresan truesi se pasan al Char.IsWhiteSpacemétodo.

¡Siempre, siempre, siempre lee la documentación!

jason avatar May 24 '2011 13:05 jason

Sí, ¡se necesita una respuesta más aquí!

Todas las soluciones hasta el momento abordan el dominio bastante limitado de la entrada canónica , a saber: un único carácter de espacio en blanco entre elementos (aunque nos felicitamos por @cherno por al menos mencionar el problema). Pero sostengo que en todos los escenarios, excepto en los más oscuros, dividirlos todos debería producir resultados idénticos:

string myStrA = "The quick brown fox jumps over the lazy dog";
string myStrB = "The  quick  brown  fox  jumps  over  the  lazy  dog";
string myStrC = "The quick brown fox      jumps over the lazy dog";
string myStrD = "   The quick brown fox jumps over the lazy dog";

String.Split(en cualquiera de los tipos que se muestran en las otras respuestas aquí) simplemente no funciona bien a menos que adjunte la RemoveEmptyEntriesopción con cualquiera de estos:

myStr.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)
myStr.Split(new char[] {' ','\t'}, StringSplitOptions.RemoveEmptyEntries)

Como revela la ilustración, omitir la opción produce cuatro resultados diferentes (etiquetados A, B, C y D) frente al resultado único de las cuatro entradas cuando se usa RemoveEmptyEntries:

String.Split frente a Regex.Split

Por supuesto, si no te gusta usar opciones, simplemente usa la alternativa de expresiones regulares :-)

Regex.Split(myStr, @"\s+").Where(s => s != string.Empty)
Michael Sorens avatar Aug 23 '2013 19:08 Michael Sorens

Según la documentación :

Si el parámetro separador es nulo o no contiene caracteres, se supone que los espacios en blanco son los delimitadores. Los caracteres de espacio en blanco están definidos por el estándar Unicode y devuelven verdadero si se pasan al método Char.IsWhiteSpace.

Así que simplemente llama. myStr.Split();No es necesario pasar nada porque el separador es una paramsmatriz.

ageektrapped avatar May 24 '2011 13:05 ageektrapped