decimal/flotante número extracción regex puede ser diferente dependiendo de si y qué mil separadores se utilizan, qué símbolo indica un separador decimal, si se desea también un exponente, si coincide o no con un positivo o negativo firmar, coincida o no con los números que pueden haber omitido 0
, extraiga o no un número que termine con un separador decimal.
A regex genérico para que coincida con los tipos de números decimales más comunes se proporciona de Matching Floating Point Numbers with a Regular Expression:
[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?
I sólo cambió el grupo de captura a un no capturar uno (añadido después de ?:
(
).It matches
Si necesita para que sea aún más genérico, si el separador decimal puede ser un punto o una coma, reemplace \.
con una clase de caracteres (o una expresión entre corchetes) [.,]
:
[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?
^^^^
Nota las expresiones anteriores coinciden con el número entero y los flotantes. única para que coincida con flotador/números decimales asegurarse de que el modelo parte fraccionaria es obligatorio mediante la eliminación de la segunda ?
después \.
(demo):
[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
Ahora, 34
no se corresponde: se empareja.
Si no desea hacer coincidir los números de flotación sin ceros a la izquierda (como .5
) hacer la primera coincidencia de patrones dígitos obligatoria (mediante la adición de +
cuantificador, para que coincida con 1 o más ocurrencias de dígitos):
[-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
Ver this demo. Ahora, que coincide mucho menos muestras:
Ahora, lo que si usted no desea hacer coincidir <digits>.<digits>
dentro <digits>.<digits>.<digits>.<digits>
? ¿Cómo combinarlos como palabras completas? Utilice lookarounds:
[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d)
Y un demo here:
Ahora, qué pasa con los flotadores que tienen separadores de miles, como 12 123 456.23
o 34,345,767.678
? Puede añadir (?:[,\s][0-9]+)*
después de la primera [0-9]+
a cero o más secuencias de una coma o un espacio en blanco seguido con 1+ dígitos:
[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9])
Véase el regex demo: Intercambiar
con una coma \.
si necesita usar una coma como separador decimal y un período como separador de miles.
Ahora, ¿cómo usar estos patrones en C#?
var results = Regex.Matches(input, @"<PATTERN_HERE>")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
me gusta la forma en que utiliza el ejemplo muy exacta de http://dotnetperls.com/regex-split – Wildhorn
@Wildhorn - ¿Qué hay de malo en eso? Probablemente lo descubrió mientras buscaba una respuesta a su problema y notó que estaba cerca, pero no lo suficientemente cerca. –