2010-04-07 1 views
0

Ceci est la chaîne d'entrée "23x + y-34 x + y + 21x - 3y2-3x-y + 2". Je veux entourer chaque caractère '+' et '-' d'espaces blancs, mais seulement s'ils ne sont pas déjà entourés du côté gauche ou du côté droit. Donc, ma chaîne d'entrée ressemblerait à ceci "23x + y - 34 x + y + 21x - 3y2 - 3x - y + 2". J'ai écrit ce code qui fait le travail:Puis-je écrire cette regex en une étape?

Regex reg1 = new Regex(@"\+(?!)|\-(?!)"); 
    input = reg1.Replace(input, delegate(Match m) { return m.Value + " "; }); 
    Regex reg2 = new Regex(@"(?<!)\+|(?<!)\-"); 
    input = reg2.Replace(input, delegate(Match m) { return " " + m.Value; }); 

explication: REG1 // Match '+' suivi d'un caractère non '' (espace) ou même chose pour '-'

REG2 // même chose seulement que je match '+' ou '-' ne précédant pas ' « (espace)

délégué 1 et 2 insérer juste "" avant et après m.Value (valeur de correspondance)

la question est, est-il un moyen de créer une seule regex et un seul délégué? c'est-à-dire faire ce travail en une étape? Je suis un nouveau à regex et je veux apprendre de manière efficace.

Répondre

6

Je ne vois pas le besoin de lookarounds ou de délégués ici. Il suffit de remplacer

\s*([-+])\s* 

avec

" $1 " 

(Voir http://ideone.com/r3Oog.)

+0

Nice site, ideone.com! –

+0

thx, je suis un nouveau à regex, je ne savais pas que cela peut être aussi simple – dontoo

3

Je vais essayer

Regex.Replace(input, @"\s*[+-]\s*", m => " " + m.ToString().Trim() + " "); 
+0

Les expressions lambda sont amusantes, mais cela peut être fait avec regex seul, comme l'a démontré @KennyTM. –