2008-12-03 5 views
1

J'essaie de trouver la meilleure méthode pour trouver un motif spécifique, puis remplace la fin du motif. Voici un exemple rapide (en C#):Regex - ne remplace que la dernière partie d'une expression

// Trouvez une valeur de l'année en commençant par un support ou souligner

string patternToFind = "[[_]2007"; 

Regex yearFind = new Regex(patternToFind); 

// Je veux modifier ces valeurs x2008 où x est le support ou souligner à l'origine dans le texte. J'essayais d'utiliser Regex.Replace(), mais je n'arrive pas à savoir s'il peut être appliqué.

Si tout le reste échoue, je peux trouver des correspondances à l'aide de MatchCollection, puis remplacer la valeur 2007 par 2008; Cependant, je suis en espérant quelque chose de plus élégant

MatchCollections matches = yearFind.Matches(" 2007 [2007 _2007"); 
foreach (Match match in matches){ 
    //use match to find and replace value 
} 

Répondre

5

Votre modèle ne fonctionne pas comme décrit: comme décrit, vous devez commencer par « \[|_ » (le moyen de canalisation OR), et la solution à votre problème réel est regroupement d'expressions rationnelles. Entourez la partie du motif qui vous intéresse entre parenthèses "(" et ")" et vous pouvez y accéder dans le remplaçant.

Vous devez donc un modèle comme celui-ci: /^(\[|_)2007/

modifier: code .NET

string s = Regex.Replace(source, @"^(\[|_)2007", @"$12008"); 

N.B. mal compris l'exigence, modèle modifié

+0

Le regroupement est définitivement la solution. Cela sera plus proche de ce qui a été demandé: chaîne s = Regex.Replace (source, @ "([\ [_]) 2007", @ "$ 12008"); –

+0

tout à fait raison, malentendu - modifié – annakata

1

Pour montrer la substitution (en utilisant vim dans ce cas). si j'ai un fichier avec le contenu suivant:

aaa _2007 
bbb , 2007 
ccc [2007] 

et j'utilise l'expression régulière

:1,$ s/\([_[ ]\)\(2007\)/\12008/g 

Le premier groupe (dans le (,)) correspondra au caractère précédant l'année et la deuxième groupe correspondra à l'année 2007. les substituts de substitution dans le premier match et tout ce qui était écrase compensée par le deuxième groupe avec 2008, ce qui donne:

aaa _2008 
bbb , 2008 
ccc [2008] 

différent regex libr Bélier aura des variations syntaxiques mineures sur ce principe.

2

Vous pouvez envelopper la partie que vous souhaitez conserver entre parenthèses pour créer un groupe de sous-correspondance. Ensuite, dans le texte de remplacement, utilisez un backreference pour le remettre dans Si je comprends bien ce que vous essayez de bien faire, vous feriez quelque chose comme ceci:.

Regex yearFind = new Regex("([[_])2007"); 
yearFine.Replace("_2007", @"$12008"); // => "_2008" 
yearFine.Replace("[2007", @"$12008"); // => "[2008" 

Le « $ 1 » dans le texte de remplacement est remplacé par tout ce qui correspond à l'intérieur des parenthèses.

Questions connexes