2012-03-28 7 views
2

J'ai une chaîne comme ci-dessous.Rechercher et remplacer dans une chaîne

string data = "A := B;\nC:=D"; 

La chaîne doit être remplacée par SET déclaration ci-dessous.

data = "SET A=B;\nSET C=D" 

Il devrait remplacer := avec = and insert a déclaration set`.

Je suis sorti avec un algorithme comme ci-dessous mais cela ne fonctionne pas quand j'ai plusieurs :=.

Existe-t-il un autre moyen plus simple et efficace de gérer cela? Peut-être en utilisant RegEx?

private string AddSETStatement(string script) 
{ 
     script = script.Replace(": =", ":="); 
     script = script.Replace(":=", ":= "); 
     script = script.Replace(" :=", ":= "); 
     int found = script.IndexOf(":="); 
     while (found > -1) 
     { 
      int foundspace = -1; 
      for (int index = found; index >= 0; index--) 
      { 
       string temp = script.Substring(index, 1); 
       if (temp == " ") 
       { 
        foundspace = index; 
        break; 
       } 
      } 
      script = script.Remove(found, 1); 
      if (foundspace == -1) 
      { 
       script = "SET " + script; 
      } 
      else 
      { 
       script = script.Insert(foundspace, " SET "); 
      } 
      found = script.IndexOf(":="); 
     } 

     return script.Trim(); 
} 

Toute aide serait appréciée.

+0

S'il vous plaît il suffit d'utiliser les balises nécessaires. Cela n'a rien à voir avec Visual Studio 2010 et n'est pas spécifique à C# 3.0 ou 4.0. C'est une question générique de remplacement de chaîne en C#, et les balises inutiles ajoutent simplement du bruit qui n'est pas utile. Merci. :) –

+0

L'entrée est-elle connue pour être bien formée? C'est-à-dire, est-ce garanti que vous n'aurez jamais quelque chose comme ": = choses aléatoires ici: ==="? Aussi, que savez-vous des variables qui précèdent et suivent le ': ='? Seront-ils toujours un personnage long? –

+1

@Ken, désolé à ce sujet.Encore tout à fait nouveau à empiler débordement – balan

Répondre

1

Je l'ai testé et je pense que c'est la commande qui correspond à vos besoins que vous avez votre algorithme avons écrit (qui peut être remplacé par une ligne de code) :

script = System.Text.RegularExpressions.Regex.Replace(script, 
    @"([A-Z]{1})[\s]{0,1}:[\s]{0,1}=[\s]{0,1}([A-Z]{1})", "SET $1=$2", 
    System.Text.RegularExpressions.RegexOptions.Multiline); 

Juste au cas où vous utilisez en fait plus d'un espace entre et autour: = vous pouvez utiliser ceci:

script = System.Text.RegularExpressions.Regex.Replace(script, 
    @"([A-Z]{1})[\s]*:[\s]*=[\s]*([A-Z]{1})", "SET $1=$2", 
    System.Text.RegularExpressions.RegexOptions.Multiline); 

Cela transforme ceci:

A := B; 
C:=D 
    E: =F 
G : = H 
    I : = K; 

Dans ceci:

SET A=B; 
SET C=D 
    SET E=F 
SET G=H 
    SET I=K; 

Et un de plus qui gère les noms de variables qui sont la peine majuscules et minuscules et contiennent des nombres:

script = System.Text.RegularExpressions.Regex.Replace(script, 
    @"([A-Za-z0-9]+)[\s]*:[\s]*=[\s]*([A-Za-z0-9]{1})", "SET $1=$2", 
    System.Text.RegularExpressions.RegexOptions.Multiline); 

Transforme cette :

Alpha1 := Bravo2; 
Char3le:=Delta9 
    E1ch3: =Foxt343 
golf : = h1 
    I3 : = k; 

Dans:

SET Alpha1=Bravo2; 
SET Char3le=Delta9 
    SET E1ch3=Foxt343 
SET golf=h1 
    SET I3=k; 

Au moins un ou ceux d'une combinaison de ceux-ci devraient être en mesure de faire le travail pour vous.

0

Très simplement ...

data = System.Text.RegularExpressions.Regex.Replace(data, "(^|\\n)", "$1SET "); 
+0

Je ne suis pas sûr que cela fonctionne. Où votre solution remplace-t-elle les variations de ': =' par '='? – Tung

+0

@balan, si vous ajoutez ce qui suit à la réponse de Diego, vous devriez pouvoir obtenir ce que vous voulez: 'data = System.Text.RegularExpressions.Regex.Replace (data, @" (\ s *: \ s * = \ s *) "," = ");'. Je ne suis pas un expert en regex, donc j'espère que quelqu'un pourra s'inscrire dans une meilleure regex. – Tung

0

Voici un exemple, avec une assez "stricte" regex:

Regex.Replace("A := B;\nC:=D", 
    @"(?<=(;|^)(\n|\s)*)(?<var1>\w+)\s*:=\s*(?<var2>\w+)\s*(?=;|$)", 
    "SET $1=$2", 
    RegexOptions.ExplicitCapture) 

Explication de la regex:

(?<= # after: 
    (;|^)  # a semicolon or the start of the string 
    (\n|\s)*) # and optional whitespace/newlines 

(?<var1>\w+) # variable name - capture it into group "var1" 
\s*   # optional whitespace 
:=   # ":=" 
\s*   # optional whitespace 
(?<var2>\w+) # second variable - capture it into group "var2" 
\s*   # optional whitespace 

(?= # followed by: 
    ;|$) # either a semicolon or the end of the string 
Questions connexes