Necesito que un texto como "joe ($ 3,004.50)" se filtre a 3004.50 pero soy terrible con las expresiones regulares y no puedo encontrar una solución adecuada. Por lo tanto, solo deben permanecer los números y los puntos, todo lo demás filtrado. Yo uso C # y VS.net 2008 framework 3.5
95

joe.smith ($3,004.50)? Simplemente eliminar las clases de personajes ofensivos puede salir mal.Regex.Replace(s, "[^$0-9.]", "");quieres dejar el signo del dólar.La expresión regular es:
Puede almacenar en caché la expresión regular:
luego usa:
Sin embargo, debe tener en cuenta que algunas culturas tienen diferentes convenciones para escribir cantidades monetarias, como: 3.004,50.
fuente
.no tiene un significado especial.Para la respuesta aceptada, MatthewGunn plantea un punto válido en el sentido de que todos los dígitos, comas y puntos de toda la cadena se condensarán. Esto evitará que:
fuente
(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)también coincidirá con "h25" en la cadena "joe.smith25 ($ 3,004.50)"El enfoque de eliminar personajes ofensivos es potencialmente problemático. ¿Qué pasa si hay otro
.en la cuerda en alguna parte? ¡No se eliminará, aunque debería!Al eliminar los no dígitos o puntos, la cadena
joe.smith ($3,004.50)se transformaría en lo que no se puede analizar.3004.50.En mi humilde opinión, es mejor hacer coincidir un patrón específico y extraerlo usando un grupo. Algo simple sería encontrar todas las comas, dígitos y puntos contiguos con regexp:
Ejecución de prueba de muestra:
Luego, para cada coincidencia, elimine todas las comas y envíelo al analizador. Para manejar el caso de algo como
12.323.344, podría hacer otra verificación para ver que una subcadena coincidente tenga como máximo una..fuente
"".Single.Parse()oSingle.TryParse?Está tratando con una cadena, la cadena es una
IEumerable<char>, por lo que puede usar LINQ:fuente