2011-06-21 9 views
1

Je suis actuellement confronté à un (petit) problème de blocage. Je voudrais remplacer une sous-chaîne par une autre en utilisant une expression régulière. Mais voici le truc: je suce à regex.Regex: remplacer une chaîne

Regex.Replace(contenu, "Request.ServerVariables("*"))", 
         "ServerVariables('test')"); 

Fondamentalement, je voudrais remplacer tout ce qui est entre le « par « test ». J'ai essayé ». {*} » Comme un modèle, mais il ne fonctionne pas.

Pourriez-vous me donner quelques conseils, je vous en serais reconnaissant

Répondre

3

Vous devez prendre en compte plusieurs problèmes.

  1. Vous utilisez des caractères spéciaux dans votre regex (., parens, citations) - dont vous avez besoin pour échapper à ceux-ci par une barre oblique. Et vous devez également éviter les barres obliques avec une autre barre oblique parce que nous sommes dans un littéral de chaîne C#, sauf si vous préfixez la chaîne avec @, auquel cas les règles d'échappement sont différentes. L'expression correspondant à "un nombre quelconque de caractères quelconques" est .*. Dans ce cas, vous voudrez faire correspondre n'importe quel nombre de caractères sans guillemets, c'est-à-dire [^"]*.
  2. Contrairement à (1) ci-dessus, la chaîne de remplacement n'est pas une expression régulière, vous ne voulez donc pas de barres obliques.
  3. Vous devez stocker la valeur de retour du remplacement quelque part.

Le résultat final est

var result = Regex.Replace(contenu, 
          @"Request\.ServerVariables\(""[^""]*""\)", 
          "Request.ServerVariables('test')"); 
1

basée uniquement sur ma connaissance de regex (et non la façon dont ils sont faits en C#), le modèle que vous voulez est probablement:

"[^"]*" 

ie - correspondent à une " puis correspondre à tout ce qui n'est pas un "alors ma tch autre "

Vous devrez peut-être échapper aux guillemets doubles pour rendre votre regex-analyseur correspond en fait sur eux ... c'est ce que je ne sais pas C#

+1

Mort droit. La version échappée ressemblera à 'Regex.Replace (contenu," Request \\. ServerVariables \\ (\ "[^ \"] * \ "\\)", "Request.ServerVariables (\" test \ ")"); 'ou' Regex.Replace (contenu, @ "Request \ .ServerVariables \ (" "[^" "] *" "\)", @ "Request.ServerVariables (" "test" ")"); ' – LukeH

0

Essayez d'éviter où vous pouvez le ' . * 'dans regex, vous pouvez généralement trouver ce que vous voulez obtenir en évitant d'autres caractères, par exemple [^ "] + non cité, ou ([^)] +) pas entre parenthèses. Donc, vous pouvez juste vouloir "([^"] +) "qui devrait vous donner le tout dans [0], puis dans [1] vous trouverez" test "

Vous pouvez aussi simplement remplacer '" "avec" je pense.

0

Taryn Orients regex comprend le *. Vous devriez le retirer, si elle est juste un espace réservé pour toute valeur:

"[^"]" 

BTW: Vous pouvez le tester avec cet éditeur regex cool: http://rubular.com/r/1MMtJNF3kM

Questions connexes