web-dev-qa-db-fra.com

Regex pour tout supprimer (non numérique OR période)

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

75
Ready Cent

Cela devrait le faire:

string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");
146
josephj1989

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.

30
Matthew Flaschen

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, ",", "");
}
2
mindriot

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
1
w.b

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 ..

0
Matthew Gunn