Regex + Convertir línea de números separados por espacios en blanco en una matriz
Frecuentes
Visto 480 veces
0
Estoy tratando de convertir una cadena que contiene varios números, donde cada número está separado por un espacio en blanco, en una matriz doble.
Por ejemplo, la cadena original se ve así:
originalString = "50 12.2 30 48.1"
He estado usando Regex.Split(originalString, @"\s*"), pero devuelve una matriz que se ve así:
[50 "" 12 "." 2 "" ...]
Cualquier ayuda es muy apreciada.
5 Respuestas
3
Usar esto en su lugar
originalString.Split(new char[]{'\t', '\n', ' ', '\r'}, StringSplitOptions.RemoveEmptyEntries);
No hay necesidad de apresurarse RegEx cada vez :)
contestado el 22 de mayo de 12 a las 19:05
2
Qué pasa string[] myArray = originalString.Split(' ');
No veo la necesidad de un RegEx aquí ...
Si realmente quieres usar un RegEx, usa el patrón \s+
en lugar de \s*
. los *
significa cero o más, pero desea dividir en uno o más caracteres de espacio.
Ejemplo de trabajo con un RegEx:
string originalString = "50 12.2 30 48.1";
string[] arr = Regex.Split(originalString, @"\s+");
foreach (string s in arr)
Console.WriteLine(s);
contestado el 22 de mayo de 12 a las 19:05
Dijo que estaba dividido por 'espacios en blanco' para que no funcionara para nuevas líneas, pestañas u otros. Tiene la expresión regular correcta, solo necesita filtrar las cosas inútiles. - chris pfohl
Intenté esto, pero desafortunadamente la cantidad de caracteres de espacio en blanco no está fijada en uno... así que terminaría con una matriz realmente extraña... - cruz keynesiana
Si el número de espacios es variable, debería probar la sobrecarga de string.Split con StringSplitOptions. Todavía no hay necesidad de expresiones regulares. - Vlad
Su ejemplo falla si coloca cualquier otro tipo de espacio en blanco. La expresión regular es necesaria a menos que enumere todos los espacios en blanco posibles en su Split
comando - chris pfohl
\s es equivalente a '\t' '\n' '\r' ' ', esa no es una lista larga, y teniendo en cuenta que RegEx suele ser más lento que dividir, creo que aún vale la pena intentarlo. - Samy Arous
1
Regex.Split(originalString, @"\s+").Where(s => !string.IsNullOrWhiteSpace(s))
La Where
devuelve un IEnumerable
con el nulo/espacio en blanco filtrado. si todavía lo quiere como una matriz, simplemente agregue .ToArray()
a esa cadena de llamadas.
La +
El carácter es necesario porque necesitas un MÍNIMO de uno para hacer de esta una coincidencia correcta.
contestado el 22 de mayo de 12 a las 19:05
Cuando intento esto, divide los dobles "es decir, 24.5" en cada uno de sus caracteres individuales (es decir, 2,4,.,5)... - cruz keynesiana
Mmm. Dame un segundo con linqpad para jugar con esto - chris pfohl
ah sí, cambié eso. Otra pregunta rápida. Esa cadena tiene una patada, contiene un "|" personaje en ella. ¿Cómo puedo usar expresiones regulares para reemplazar eso (idealmente con un espacio en blanco)? Lo que estaba matando el mío era que estaba tratando de hacer: Regex.Match(orgString, "|"), pero debido a que es un carácter especial, solo agrega una tonelada de espacios en blanco (por lo que pensé que este método no funcionaba en primero) - cruz keynesiana
Para hacer coincidir caracteres especiales, debe precederlos con la antibarra (¿o es una barra?) "\|" :) Nuevamente, podría simplemente usar String.Replace en su lugar. Sigo pensando que este método no es el más rápido (Split + Where + ToArray). Pero si todavía quieres trabajar con Regex... - Samy Arous
1
Me quedaría con String.Split
, proporcionando todos los caracteres de espacio en blanco que espera.
En expresiones regulares, \s
es equivalente a [ \t\r\n]
(además de algunos otros caracteres específicos del sabor en uso); podemos representarlos a través de un char[]
:
string[] nums = originalString.Split(
new char[] { ' ', '\t', '\r', '\n' },
StringSplitOptions.RemoveEmptyEntries);
contestado el 22 de mayo de 12 a las 19:05
1
El comportamiento predeterminado si pasa null
como separador de String.Split
es dividir en espacios en blanco. Eso incluye cualquier cosa que coincida con Unicode IsWhiteSpace
prueba. Dentro del rango ASCII eso significa tabulador, salto de línea, tabulador vertical, salto de página, retorno de carro y espacio.
También puede evitar los campos vacíos pasando el RemoveEmptyEntries
.
originalString = "50 12.2 30 48.1";
string[] fields = originalString.Split(null as char[], StringSplitOptions.RemoveEmptyEntries);
contestado el 22 de mayo de 12 a las 19:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# regex or haz tu propia pregunta.
Si pudiera marcar las tres de abajo como respuestas, yo... - keynesiancross
La gente está menos preocupada por quién obtiene la respuesta correcta que por obtener la respuesta correcta :) Al menos eso espero. - Samy Arous
@Icfseth +1, mientras funcione. - Chris Pfohl
@keynesiancross, si no usa LinqPad, debería hacerlo. Hace que la depuración de este tipo de cosas sea mucho más fácil. ¡Y es gratis! - Chris Pfohl