2010-08-24 5 views
0

Je veux substituer tout l'espace blanc qui précède la classe [A-Za-z0-9_], avec $.Substitution regex

$string = "STRING sDir = sDrive"; 
$string =~ s/\s(?=[A-Za-z0-9_])/ \$/; 

Il correspond à une seule fois et produit:

STRING $sDir = sDrive; 
+0

Vous pouvez utiliser '\ W' au lieu de '[A-Za-z0-9_]'. –

+3

@eugene Non, vous ne pouvez pas utiliser '\ w' comme synonyme de' [A-Za-z0-9_] '. Si vous voulez dire '\ w 'avec toutes ses implications, alors utilisez' \ w'. Si vous voulez dire [A-Za-z0-9_] ', utilisez [A-Za-z0-9_]'. –

+0

vous pouvez si vous savez que vous avez affaire à des ascii, cependant. – muhmuhten

Répondre

2

Vous pouvez utiliser le drapeau g pour votre regex:

$string = "STRING sDir = sDrive"; 
$string =~ s/\s(?=[A-Za-z0-9_])/ \$/g; 

de sorte que le s/// fonctionnera pour chaque match pour votre modèle. Par défaut, le comportement de Perl consiste à effectuer la substitution une fois.

L'indicateur g lui indique d'effectuer la substitution pour chaque occurrence.

+1

Cela remplacera les tabulations, les retours à la ligne et les autres espaces avec un 'espace' aussi, alors soyez prudent. Ou remplacez simplement l'expression régulière par 's/(\ s) (? = [A-Za-z0-9 _])/$ 1 \ $/g'. Aussi, vous pouvez essayer 's/(? <= \ S) (? = [A-Za-z0-9 _])/\ $/g'. Les deux ne sont pas testés, mais le premier devrait fonctionner à coup sûr. – manixrock

+0

droite, je me concentrais sur la chose de répétition. – benzebuth

+0

Merci. Cela fonctionne très bien. – Dorian06

3

Pour correspondre plusieurs fois, utilisez le drapeau/g:

$string = "STRING sDir = sDrive"; 
$string =~ s/\s(?=[A-Za-z0-9_])/ \$/g; 
0

si je pense que vous voulez dire ce que vous entendez:

s/\s+\b/ \$/g; 

cela supprime tous les espaces avant (si ' a' ->' $a') et \ b est une affirmation de l'un ou (?=(?<=\W)\w)(?=(<=\w)\W_; \ s est toujours \W, et [a-zA-Z0-9_] correspond à la définition commune de \w, il correspond donc à (?=[...]).

(bien sûr, si vous avez affaire à des jeux de caractères dans lequel \w ne sont pas les mêmes que [a-zA-Z0-9], vous devrez remplacer \b pour l'affirmation.)