J'ai besoin d'un texte comme "joe (3 004,50 $)" pour être filtré jusqu'à 3004,50 mais je suis terrible en regex et je ne trouve pas de solution adéquate. Donc, seuls les nombres et les périodes doivent rester - tout le reste filtré. J'utilise C # et VS.net 2008 Framework 3.5
Cela devrait le faire:
string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");
La regex est:
[^0-9.]
Vous pouvez mettre en cache la regex:
Regex not_num_period = new Regex("[^0-9.]")
puis utilisez:
string result = not_num_period.Replace("joe ($3,004.50)", "");
Cependant, vous devez garder à l'esprit que certaines cultures ont des conventions différentes pour l'écriture de montants, tels que: 3.004,50.
Pour la réponse acceptée, MatthewGunn soulève un point valide en ce sens que tous les chiffres, virgules et points de la chaîne entière seront condensés. Cela évitera que:
string s = "joe.smith ($3,004.50)";
Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)");
Match m = r.match(s);
string v = null;
if (m.Success) {
v = m.Groups[1].Value;
v = Regex.Replace(v, ",", "");
}
Vous avez affaire à une chaîne - chaîne est un IEumerable<char>
, vous pouvez donc utiliser LINQ:
var input = "joe ($3,004.50)";
var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.'));
Console.WriteLine(result); // 3004.50
L'approche consistant à supprimer les personnages incriminés est potentiellement problématique. Et s'il y a un autre .
dans la chaîne quelque part? Il ne sera pas supprimé, bien que cela devrait l'être!
En supprimant les chiffres ou les points, la chaîne joe.smith ($3,004.50)
se transformerait en .3004.50
non analysable.
À mon avis, il est préférable de faire correspondre un modèle spécifique et de l'extraire à l'aide d'un groupe. Quelque chose de simple serait de trouver toutes les virgules, chiffres et points contigus avec expression rationnelle:
[\d,\.]+
Exemple de test:
Pattern understood as:
[\d,\.]+
Enter string to check if matches pattern
> a2.3 fjdfadfj34 34j3424 2,300 adsfa
Group 0 match: "2.3"
Group 0 match: "34"
Group 0 match: "34"
Group 0 match: "3424"
Group 0 match: "2,300"
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 a au plus un .
.