2010-03-02 8 views
2

J'écris une méthode pour prendre une chaîne "filtre" DevExpress et la convertir en une chaîne SQL utilisable. Pour la plupart, c'est facile avec de simples substitutions de chaînes ici ou là. Une chose, cependant, m'a gratté la tête parce que je n'ai tout simplement pas pris le temps d'apprendre les expressions régulières en C# /. NET.Comment utiliser l'objet Expression régulière C# pour effectuer cette substitution?

Lorsqu'un nombre décimal est utilisé, DevExpress émet une chaîne comme « FieldName> 2.0m ». Le problème est le signifiant décimal, "m" à la fin du nombre. Je dois prendre toutes les sous-chaînes du format ###. ### m et les changer en ###. ### (où le nombre de chiffres est variable). Si je me souviens bien, correspondant à ce nombre serait quelque chose comme:

[0-9,.]* 

Mais comment puis-je recherche un numéro avec le « m » à la fin et comment puis-je utiliser la classe Regex pour générer une nouvelle chaîne avec le m enlevé?

Merci!

Répondre

3
Regex.Replace(source, @"(\d+\.\d+)m", "$1"); 
+0

Je connais peu regex '.NET': qu'est-ce que' ('' suivi par '(' signifie?) Dans la plupart des saveurs regex je sais, c'est une syntaxe invalide EDIT: ah, vous avez oublié le ':' ... Dans lequel Si vous l'esprit aussi bien le faire: '@ « (. \ d + \ \ d +) m »' –

+0

Ouais, mais je me suis aperçu que je ne l'ai pas besoin du tout –

+0

Eh bien, jamais trop tard pour modifier, droit –

3

Cela correspond chaînes suivantes ce modèle - un ou plusieurs numéros, suivi d'un ., suivi d'un ou plusieurs numéros, suivi d'un m:

\d+\.\d+m 

Voir this mémento pratique.

Afin de pouvoir se référer au nombre initial (sans m), vous devez capturer le match (captured group) pour une référence arrière à l'aide ():

(\d+\.\d+)m 

Cela vous permettra maintenant remplacer:

RegEx.Replace(source, @"(\d+\.\d+)m" ,"$1"); 

le $1 se réfère au premier groupe capturé.

+0

+1 pour la feuille de triche. – JonH

+0

+1 pour la feuille de triche et pour l'explication du groupe capturé et de la référence arrière. –

2
Regex re = new Regex(@"(\d+\.\d+)m"); 
foreach (Match m in re.Match(str)) 
    m.Groups[1]; //will contain ###.### 
Questions connexes