2009-09-15 7 views
0

j'ai essayé de remplacer   éléments dans une chaîne en utilisant regex .NET - avec pas de chance :)Regex pour remplacer la chaîne

Assumer la chaîne suivante:

 AA A  C D   A Some Text   here

Les règles

  1. Ne pas remplacer au début de la ligne
  2. Ne remplacer que les occurrences uniques
  3. Ne pas remplacer si un espace est avant ou après (en option)

Le résultat souhaité ci-dessus est (# comme caractère de remplacement):

 AA#A  C#D   A#Some Text   here

Répondre

2

Cela devrait couvrir tous les trois de vos besoins. Excusez le formatage; J'ai dû cocher les premières lignes pour que le   s'affiche correctement.

string pattern = @"(?<!^|&nbsp;)((?<!\s)&nbsp;(?!\s))(?!\1)";

string[] inputs = { "&nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A&nbsp;Some Text &nbsp; here", // original

"&nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A &nbsp;Some Text &nbsp; here" // space before/after

};

foreach (string input in inputs) 
{ 
    string result = Regex.Replace(input, pattern, "#"); 
    Console.WriteLine("Original: {0}\nResult: {1}", input, result); 
} 

sortie:

Original: &nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A&nbsp;Some Text &nbsp; here

Result: &nbsp;AA#A&nbsp;&nbsp;C#D&nbsp;&nbsp; A#Some Text &nbsp; here

Original: &nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A &nbsp;Some Text &nbsp; here

Result: &nbsp;AA#A&nbsp;&nbsp;C#D&nbsp;&nbsp; A &nbsp;Some Text &nbsp; here

+0

Merci beaucoup. La prochaine fois je vais simplement vous envoyer mes sources à corriger :) Excellent exemple !!! – ManniAT

1

Je ne suis pas au courant C# de particulier saveur regex mais dans le style PERL/PHP cela fonctionne pour moi:

s/(?<!\A| |&nbsp;)&nbsp;(?!&nbsp;|)/#/g

ce r elies sur lookbehind négatif, lookahead négatif et le \ A = début de la séquence d'échappement d'entrée.

+0

Would (avec quelques modifications) travail - merci. Je choisis la réponse d'Ahmad car elle résout tout le problème. – ManniAT

1

Vous devriez essayer l'exemple suivant:

string s = Regex.Replace(original, "(?<!(&nbsp;| |^))&nbsp;(?!(&nbsp;|))", "#");

+0

oui j'ai eu le même problème ... utiliser la coche de retour pas l'indentation de 4 espaces. – beggs

+0

@beggs: Merci, essayait juste de comprendre cela. Éditera. – LukeH

+0

Vous pourriez le raccourcir plus loin à '(?

0

Vous pouvez utiliser ce un

[^^\s(nbsp;)](nbsp;)[^$\s(nbsp;)] 
Questions connexes