2012-03-28 12 views
2

Ich habe eine Zeichenfolge wie folgt.Suchen und Ersetzen innerhalb einer Zeichenfolge

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

Die Saite hat mit SET Anweisung wie unten ersetzt werden.

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

Es sollte := mit = and insert a Set` Anweisung ersetzen.

Ich kam mit einem Algorithmus wie folgt heraus, aber es funktioniert nicht, wenn ich mehrere := habe.

Gibt es eine andere einfache und effiziente Möglichkeit, dies zu umgehen? Vielleicht mit 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(); 
} 

Jede Hilfe wäre willkommen.

+0

Bitte benutzen Sie einfach notwendig Tags. Dies hat nichts mit Visual Studio 2010 zu tun und ist nicht spezifisch für C# 3.0 oder 4.0. Es ist eine allgemeine C# -String-Ersatzfrage und unnötige Tags fügen nur Rauschen hinzu, das nicht hilfreich ist. Vielen Dank. :) –

+0

Ist der Eingang wohl bekannt? Das heißt, ist es garantiert, dass Sie nie etwas wie ": = zufällige Sachen hier: ===" haben werden? Was wissen Sie auch über die Variablen, die dem ': =' vorausgehen und folgen? Werden sie immer einen Charakter lang sein? –

+1

@Ken, tut mir leid.Immer noch ziemlich neu zu stapeln Überlauf – balan

Antwort

1

Ich habe dies getestet und ich denke, das ist der Befehl, die Ihren Anforderungen entspricht, wie Sie Ihren Algorithmus codiert haben (die mit einer Zeile Code ersetzt werden kann)

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); 

Gerade falls Sie tatsächlich mehr als ein Raum zwischen und um verwenden: = Sie können diese stattdessen verwenden:

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

Das macht:

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

In diese:

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

Und noch eine, die Variablennamen behandelt, die die Mühe sind Groß- und Kleinschreibung und Zahlen enthalten:

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); 

Stellt sich diese :

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

In:

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

Mindestens eine solche oder eine Kombination dieser Lage sein sollte, die Arbeit für Sie tun. Hier

0

Ganz einfach ...

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

Ich bin mir nicht sicher, ob das funktioniert. Wo ersetzt Ihre Lösung Variationen von ': =' mit '='? – Tung

+0

@balan, wenn Sie das Folgende zu Diego's Antwort hinzufügen, sollten Sie in der Lage sein zu bekommen, was Sie wollen: 'data = System.Text.RegularExpressions.Regex.Replace (Daten, @" (\ s *: \ s * = \ s *) "," = ");'. Ich bin kein Experte für Regex, also hoffe ich, dass jemand auf eine bessere Regex einläuten kann. – Tung

0

ist ein Beispiel, mit einem ziemlich "streng" regex:

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

Erklärung des 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 
Verwandte Themen