Digamos que tengo una cadena como:
"Hello how are you doing?"
Me gustaría una función que convierta varios espacios en un solo espacio.
Entonces obtendría:
"Hello how are you doing?"
Sé que podría usar expresiones regulares o llamar
string s = "Hello how are you doing?".replace(" "," ");
Pero tendría que llamarlo varias veces para asegurarme de que todos los espacios en blanco secuenciales se reemplacen con solo uno.
¿Existe ya un método incorporado para esto?
c#
string
whitespace
Mate
fuente
fuente
Respuestas:
fuente
Esta pregunta no es tan simple como lo han hecho otros carteles (y como originalmente creí que era), porque la pregunta no es tan precisa como debería ser.
Hay una diferencia entre "espacio" y "espacio en blanco". Si solo te refieres a espacios, entonces debes usar una expresión regular de
" {2,}"
. Si te refieres a cualquier espacio en blanco, es un asunto diferente. ¿Deben convertirse todos los espacios en blanco en espacios? ¿Qué debería pasar con el espacio al principio y al final?Para el punto de referencia a continuación, asumí que solo te preocupan los espacios y que no quieres hacer nada con los espacios individuales, incluso al principio y al final.
Tenga en cuenta que la corrección es casi siempre más importante que el rendimiento. El hecho de que la solución Split / Join elimine cualquier espacio en blanco inicial / final (incluso solo espacios simples) es incorrecto en lo que respecta a sus requisitos especificados (que pueden estar incompletos, por supuesto).
El punto de referencia utiliza MiniBench .
Algunas ejecuciones de prueba:
Aquí, el primer número es el número de iteraciones, el segundo es el tiempo necesario y el tercero es una puntuación escalada, siendo 1.0 el mejor.
Eso muestra que en al menos algunos casos (incluido este) una expresión regular puede superar a la solución Split / Join, a veces por un margen muy significativo.
Sin embargo, si cambia a un requisito de "todos los espacios", luego de Split / Join no aparecerá en ganar. Como suele ser el caso, el diablo está en los detalles ...
fuente
Un expressoin regular sería la forma más fácil. Si escribe la expresión regular de la manera correcta, no necesitará varias llamadas.
Cámbielo a esto:
fuente
@"\s{2,}"
es que no reemplaza las pestañas individuales y otros caracteres de espacio Unicode con un espacio. Si va a reemplazar 2 pestañas con un espacio, probablemente debería reemplazar 1 pestaña con un espacio.@"\s+"
lo hará por ti.Si bien las respuestas existentes están bien, me gustaría señalar un enfoque que no funciona:
Esto puede repetirse para siempre. ¿A alguien le importa adivinar por qué? (Solo me encontré con esto cuando se hizo como una pregunta de un grupo de noticias hace unos años ... alguien realmente lo encontró como un problema).
fuente
Como ya se señaló, esto se hace fácilmente mediante una expresión regular. Solo agregaré que es posible que desee agregar un .trim () a eso para deshacerse de los espacios en blanco iniciales / finales.
fuente
Aquí está la solución con la que trabajo. Sin RegEx y String.Split.
así que puedes:
fuente
Un eliminador de espacios en blanco adicional rápido ... Este es el más rápido y se basa en la copia in situ de Felipe Machado.
Los puntos de referencia ...
InPlaceCharArraySpaceOnly por Felipe Machado en CodeProject 2015 y modificado por Sunsetquest para eliminación de múltiples espacios. Tiempo: 3,75 garrapatas
InPlaceCharArray de Felipe Machado 2015 y ligeramente modificado por Sunsetquest para la eliminación de varios espacios. Time 6.50 Ticks (también admite pestañas)
SplitAndJoinOnSpace por Jon Skeet . Tiempo: 13.25 garrapatas
StringBuilder de fubo Tiempo: 13,5 ticks (también admite pestañas)
Regex con compilación de Jon Skeet . Tiempo: 17 garrapatas
StringBuilder por David S 2013 Tiempo: 30,5 ticks
Regex sin compilar por Brandon Tiempo: 63.25 ticks
StringBuilder por user214147 Tiempo: 77.125 Ticks
Regex con Tim Hoolihan no compilado Tiempo: 147.25 ticks
El código de referencia ...
}
Notas de referencia: modo de lanzamiento, sin depurador adjunto, procesador i7, promedio de 4 ejecuciones, solo se probaron cadenas cortas
fuente
Estoy compartiendo lo que uso, porque parece que se me ocurrió algo diferente. He estado usando esto por un tiempo y es lo suficientemente rápido para mí. No estoy seguro de cómo se compara con los demás. Lo uso en un escritor de archivos delimitados y ejecuto tablas de datos grandes un campo a la vez a través de él.
fuente
Usando el programa de prueba que publicó Jon Skeet, traté de ver si podía hacer que un bucle escrito a mano se ejecutara más rápido.
Puedo vencer a NormalizeWithSplitAndJoin cada vez, pero solo vencer a NormalizeWithRegex con entradas de 1000, 5.
No he mirado el código de máquina que produce el jitter, sin embargo, espero que el problema sea el tiempo que tarda la llamada a StringBuilder.Append () y para hacerlo mucho mejor necesitaría el uso de código inseguro.
Entonces, Regex.Replace () es muy rápido y difícil de superar.
fuente
VB.NET
C#
Disfrute del poder de LINQ = D
fuente
string.Join(" ", myString.Split(' ').Where(s => s != " ").ToArray())
Split
captura de todos los espacios en blanco y eliminar laWhere
cláusula:myString.Split(null as char[], StringSplitOptions.RemoveEmptyEntries)
fuente
Solución más pequeña:
var regExp = / \ s + / g, newString = oldString.replace (regExp, '');
fuente
Puedes probar esto:
fuente
Los grupos de reemplazo proporcionan un enfoque de implementación que resuelve el reemplazo de varios caracteres de espacio en blanco con el mismo único:
Tenga en cuenta que el segundo ejemplo se mantiene solo
\n
mientras que la respuesta aceptada reemplazaría el final de la línea con un espacio.Si necesita reemplazar cualquier combinación de caracteres de espacio en blanco con el primero, simplemente elimine la referencia
\k
inversa del patrón.fuente
El uso de expresiones regulares, para reemplazar 2 o más espacios en blanco con un solo espacio, también es una buena solución.
Estamos usando el patrón de expresiones regulares como " \ s + ".
\ s coincide con un espacio, tabulación, nueva línea, retorno de carro, avance de página o tabulación vertical.
'+' dice una o más ocurrencias.
Ejemplo de regex
fuente
No hay forma integrada de hacer esto. Puedes probar esto:
Esto eliminará los espacios en blanco iniciales y finales, así como colapsará cualquier espacio en blanco interno a un solo carácter de espacio en blanco. Si realmente solo desea contraer espacios, entonces las soluciones que usan una expresión regular son mejores; de lo contrario, esta solución es mejor. (Vea el análisis realizado por Jon Skeet).
fuente
source.ToCharArray()
y luego tirando el resultado?ToCharArray()
al resultado de string.Join, solo para crear una nueva cadena ... wow, que esté en una publicación quejándose de sobrecarga es simplemente notable. -1.whitespace
sea asínew char[] { ' ' }
, esto dará un resultado incorrecto si la cadena de entrada comienza o termina con un espacio.