J'ai besoin d'un texte comme "joe (3 004,50 $)" pour être filtré jusqu'à 3004,50 mais je suis terrible à regex et je ne trouve pas de solution appropriée. Ainsi, seuls les nombres et les périodes doivent rester - tout le reste est filtré. J'utilise C # et VS.net 2008 framework 3.5
93
joe.smith ($3,004.50)
? Le simple fait de supprimer les classes de caractères incriminées peut être très faux.Regex.Replace(s, "[^$0-9.]", "");
vous voulez laisser le signe dollar.Le regex est:
Vous pouvez mettre en cache l'expression régulière:
puis utilisez:
Cependant, vous devez garder à l'esprit que certaines cultures ont des conventions différentes pour l'écriture des montants monétaires, telles que: 3.004,50.
la source
.
n'a pas de signification particulière.Pour la réponse acceptée, MatthewGunn soulève un point valide en ce que tous les chiffres, virgules et points de la chaîne entière seront condensés ensemble. Cela évitera que:
la source
(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)
correspondra également à "h25" dans la chaîne "joe.smith25 (3 004,50 $)"L'approche consistant à supprimer les personnages fautifs est potentiellement problématique. Et s'il y en avait un autre
.
dans la chaîne quelque part? Il ne sera pas supprimé, bien qu'il le soit!En supprimant les non-chiffres ou les points, la chaîne
joe.smith ($3,004.50)
se transformerait en non analysable.3004.50
.Imho, il est préférable de faire correspondre un modèle spécifique et de l'extraire en utilisant un groupe. Quelque chose de simple serait de trouver toutes les virgules, chiffres et points contigus avec l'expression rationnelle:
Exemple de test:
Ensuite, pour chaque correspondance, supprimez toutes les virgules et envoyez-les à l'analyseur. Pour gérer le cas de quelque chose comme
12.323.344
, vous pouvez faire une autre vérification pour voir qu'une sous-chaîne correspondante en a au plus une.
.la source
""
.Single.Parse()
ouSingle.TryParse
?Vous avez affaire à une chaîne - la chaîne est un
IEumerable<char>
, vous pouvez donc utiliser LINQ:la source