2010-01-13 10 views
6

J'ai besoin pour analyser une chaîne de sorte que le résultat devrait sortie comme ça:Regex suppression de la virgule double/triple dans la chaîne

"abc,def,ghi,klm,nop" 

Mais la chaîne que je reçois semble pourrait plus comme ça:

",,,abc,,def,ghi,,,,,,,,,klm,,,nop" 

Le fait est, je ne sais pas à l'avance combien de virgules sépare les mots.
Existe-t-il une expression rationnelle que je pourrais utiliser en C# qui pourrait m'aider à résoudre ce problème?

Répondre

10

Vous pouvez utiliser l'expression ,{2,} pour faire correspondre des occurrences de 2 virgules ou plus, puis les remplacer par une simple virgule.

Vous aurez probablement besoin également d'un appel Trim pour supprimer les virgules de gauche ou de fin de l'appel Regex.Replace. (Il est possible qu'il y ait une certaine façon de le faire avec juste un regex remplacer, mais rien ne vient immédiatement à l'esprit.)

string goodString = Regex.Replace(badString, ",{2,}", ",").Trim(','); 
+0

Merci Luc, il fait le tour assez bien! – MissRaphie

6

Recherchez ,,+ et remplacez tous par ,.

Donc, en C# qui pourrait ressembler à

resultString = Regex.Replace(subjectString, ",,+", ","); 

,,+ signifie « correspondre toutes les occurrences de deux virgules ou plus », donc des virgules simples ne seront pas touchés. Cela peut également être écrit comme ,{2,}.

3

une solution simple, sans expressions régulières:

string items = inputString.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
string result = String.Join(",", items); 
+0

Bon à savoir cette solution! Merci ! – MissRaphie

2

En fait, vous pouvez faire sans aucun appel Trim.

text = Regex.Replace(text, "^,+|,+$|(?<=,),+", ""); 

devrait faire l'affaire.

L'idée derrière la regex est de ne faire que correspondre à ce que nous voulons supprimer. La première partie correspond à toute chaîne de virgules consécutives au début de la chaîne d'entrée, la deuxième correspond à toute chaîne de virgules consécutives à la fin, tandis que la dernière correspond à une chaîne de virgules consécutives suit une virgule.

1

Voici mon effort:

//Below is the test string 
string test = "YK  002  10  23   30   5  TDP_XYZ " 
private static string return_with_comma(string line) 
    { 
     line = line.TrimEnd(); 
     line = line.Replace(" ", ","); 
     line = Regex.Replace(line, ",,+", ","); 
     string[] array; 
     array = line.Split(','); 
     for (int x = 0; x < array.Length; x++) 
     { 
      line += array[x].Trim(); 
     } 
     line += "\r\n"; 
     return line; 
    } 
string result = return_with_comma(test); 
//Output is 
//YK,002,10,23,30,5,TDP_XYZ 
Questions connexes