2010-07-07 8 views
8

J'ai une chaîne comme "AAA 101 B202 C 303" et je veux me débarrasser de l'espace entre le caractère et le nombre s'il y en a. Donc, après l'opération, la chaîne devrait être comme "AAA101 B202 C303". Mais je ne suis pas sûr que regex puisse faire ça?Problème de correspondance de motifs en C#

Une aide? Merci d'avance.

Répondre

8

Oui, vous pouvez le faire avec des expressions régulières. Voici un exemple bref mais complet:

using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     string text = "A 101 B202 C 303 "; 
     string output = Regex.Replace(text, @"(\p{L}) (\d)", @"$1$2"); 
     Console.WriteLine(output); // Prints A101 B202 C303 
    } 
} 

(. Si vous allez faire beaucoup, vous pouvez bien vouloir compiler une expression régulière pour le motif)

Les \p{L} matchs toute lettre unicode - Vous voudrez peut-être être plus restrictif.

1

Vous pouvez faire quelque chose comme

([A-Z]+)\s?(\d+) 

et les remplacer par

$1$2 

L'expression peut être serré, mais ci-dessus doivent travailler pour votre chaîne d'entrée par exemple. Cela consiste à déclarer un groupe contenant des lettres (premier ensemble de parenthèses), puis un espace facultatif (\ s?), Puis un groupe de chiffres (\ d +). Les groupes peuvent être utilisés dans le remplacement en se référant à leur index, donc quand vous voulez vous débarrasser de l'espace, remplacez simplement par $ 1 $ 2.

+1

Pourquoi faire de l'espace en option? Après tout, c'est ce dont il s'agit. –

0

Bien que pas aussi concis que Regex, le code C# pour quelque chose comme ceci est assez simple et très-course rapide:

StringBuilder sb = new StringBuilder(); 
for(int i=0; i<s.Length; i++) 
{ 
    // exclude spaces preceeded by a letter and succeeded by a number 
    if(!(s[i] == ' ' 
     && i-1 >= 0 && IsLetter(s[i-1]) 
     && i+1 < s.Length && IsNumber(s[i+1]))) 
    { 
     sb.Append(s[i]); 
    } 
} 
return sb.ToString(); 
0

Juste pour le plaisir (car est/devrait être amusant parfois l'acte de programmation) : o) J'utilise LINQ avec Aggregate:

var result = text.Aggregate(
string.Empty, 
(acc, c) => char.IsLetter(acc.LastOrDefault()) && Char.IsDigit(c) ? 
acc + c.ToString() : acc + (char.IsWhiteSpace(c) && char.IsLetter(acc.LastOrDefault()) ? 
string.Empty : c.ToString())).TrimEnd(); 
Questions connexes