Esta es la respuesta más correcta que encomtrarás brindar, pero estúdiala pausadamente y valora si se adapta a tu trabajo.
Solución:
Pequeña mejora a la solución de @Michael:
// NOTES: about the LINQ:
// .Where() == filters the IEnumerable (which the array is)
// (c=>...) is the lambda for dealing with each element of the array
// where c is an array element.
// .Trim() == trims all blank spaces at the start and end of the string
var doubleArray = Regex.Split(sentence, @"[^0-9.]+")
.Where(c => c != "." && c.Trim() != "");
Devoluciones:
10.4
20.5
40
1
La solución original estaba volviendo
[empty line here]
10.4
20.5
40
1
.
los expresión regular de extracción de números decimales/flotantes puede ser diferente dependiendo de si se usan y qué separadores de mil, qué símbolo denota un separador decimal, si también se quiere hacer coincidir un exponente, si hacer coincidir o no un signo positivo o negativo, si hacer coincidir o no números que pueden tener números iniciales 0
omitido, si se extrae o no un número que termina con un separador decimal.
A expresión regular genérica para que coincida con los tipos de números decimales más comunes se proporciona en Hacer coincidir números de punto flotante con una expresión regular:
[-+]?[0-9]*.?[0-9]+(?:[eE][-+]?[0-9]+)?
Solo cambié el grupo de captura a uno que no captura (agregado ?:
después (
). Coincide
Si necesita hacerlo aún más genérico, si el separador decimal puede ser un punto o una comareemplazar .
con una clase de carácter (o una expresión entre paréntesis) [.,]
:
[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?
^^^^
Nota las expresiones anteriores coinciden con números enteros y flotantes. Para hacer coincidir solo números flotantes/decimales asegúrese de que la parte del patrón fraccionario sea obligatoria eliminando la segunda ?
después .
(manifestación):
[-+]?[0-9]*.[0-9]+(?:[eE][-+]?[0-9]+)?
^
Ahora, 34
no coincide: está emparejado.
Si no desea hacer coincidir números flotantes sin ceros a la izquierda (como .5
) hacer que el patrón de coincidencia del primer dígito sea obligatorio (agregando +
cuantificador, para hacer coincidir 1 o más ocurrencias de dígitos):
[-+]?[0-9]+.[0-9]+(?:[eE][-+]?[0-9]+)?
^
Vea esta demostración. Ahora, coincide con muchas menos muestras:
Ahora, qué pasa si no quieres emparejar
en el interior
? como combinarlos como palabras completas? Utilizar miradas alrededor:
[-+]?(?
Y una demostración aquí:
Ahora, ¿qué pasa con esos flotadores que tienen mil separadores, como 12 123 456.23
o 34,345,767.678
? Puedes agregar (?:[,s][0-9]+)*
después de la primera [0-9]+
para hacer coincidir cero o más secuencias de una coma o un espacio en blanco seguido de más de 1 dígito:
[-+]?(?
Vea la demostración de expresiones regulares:
Intercambiar una coma con .
si necesita usar una coma como separador decimal y un punto como separador de miles.
Ahora, ¿cómo usar estos patrones en C#?
var results = Regex.Matches(input, @"")
.Cast()
.Select(m => m.Value)
.ToList();
tratar
Regex.Split (sentence, @"[^0-9.]+")
Sección de Reseñas y Valoraciones
Si tienes algún recelo y capacidad de reaccionar nuestro artículo te mencionamos añadir una interpretación y con placer lo leeremos.