2012-03-28 169 views
2

我有一個字符串,如下所示。搜索並替換字符串

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

該字符串必須替換爲SET聲明如下。

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

應該用= and insert a SET`語句來替換:=

我推出瞭如下的算法,但當我有多個:=時它不工作。

有沒有其他最簡單有效的方法來處理這個問題?也許使用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(); 
} 

任何幫助,將不勝感激。

+0

請只使用必要的標記。這與Visual Studio 2010無關,它並不特定於C#3.0或4.0。這是一個通用的C#字符串替換問題,不必要的標籤只是增加了無用的噪音。謝謝。 :) – 2012-03-28 00:36:53

+0

輸入是否已知結構良好?也就是說,它保證你永遠不會有像「:=隨機的東西在這裏:===」?另外,你知道什麼與':='之前和之後的變量相關嗎?他們總是會變成一個角色嗎? – 2012-03-28 00:37:48

+1

@Ken,對不起。堆棧溢出仍然很新 – balan 2012-03-28 01:01:01

回答

1

我測試過這一點,我認爲這是一個爲你匹配編碼您的要求命令你的算法(可以用一行代碼來代替) :

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

萬一你實際使用之間的一個以上的空間和周圍:=你可以使用它代替:

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

這變成這樣:

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

進入這個:

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

還有一它處理的變量名都懶得大小寫和包含數字:

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

打開此:

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

分爲:

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

至少有一個或那些的組合應該可以做的工作適合你。

0

很簡單...

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

我不確定這是否有效。你的解決方案在哪裏用'='替換':='的變體? – Tung 2012-03-28 00:45:16

+0

@balan,如果你在迭戈的答案中添加以下內容,你應該能夠得到你想要的:data = System.Text.RegularExpressions.Regex.Replace(data,@「(\ s *:\ s * = \ s *)「,」=「);'。我不是正則表達式的專家,所以我希望有人可以在更好的正則表達式中加入。 – Tung 2012-03-28 01:02:26

0

下面是一個例子,有一個相當 「嚴謹」 的正則表達式:

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

正則表達式的說明:

(?<= # 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