Regex + Convertir línea de números separados por espacios en blanco en una matriz

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.

preguntado el 22 de mayo de 12 a las 19:05

Si pudiera marcar las tres de abajo como respuestas, yo... -

La gente está menos preocupada por quién obtiene la respuesta correcta que por obtener la respuesta correcta :) Al menos eso espero. -

@Icfseth +1, mientras funcione. -

@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! -

5 Respuestas

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

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

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

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

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 or haz tu propia pregunta.