2012-03-28 14 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#の文字列の置換の質問であり、不要なタグはノイズを追加するだけでは役に立ちません。ありがとう。 :) –

+0

入力は整形式であることが知られていますか?つまり、 ":=ランダムなものはここに==="のようなものは決してないでしょうか?また、 ':='に先行して従う変数には何を知っていますか?彼らはいつも一文字になるだろうか? –

+1

@Ken、申し訳ありません。スタックオーバーフローにはまだかなり新しい@Kshitij – balan

答えて

1

私はこれをテストしていると私はこれがあなたが(1行のコードに置き換えることができます)あなたのアルゴリズムをコード化されてきたようにあなたの条件に一致するコマンドだと思います=あなたの代わりにこれを使用することができます:

script = System.Text.RegularExpressions.Regex.Replace(script, 
    @"([A-Z]{1})[\s]*:[\s]*=[\s]*([A-Z]{1})", "SET $1=$2", 
    System.Text.RegularExpressions.RegexOptions.Multiline); 
を、あなたは実際には、複数の空間とし、周りを使う

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

念のために:

これは、このターン:

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

そして、大文字と小文字を気にして数字を含んでいる変数名を扱う1以上:

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

はこれをオンにし、この中へ

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

を:

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

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

少なくとも1それらまたはそれらの組み合わせは、あなたのための作業を行うことができるはず。ここで

0

非常に単純...

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

私はこの作品が分からない。あなたのソリューションは ':='と '='のバリエーションをどこに置き換えますか? – Tung

+0

@balan、Diegoの答えに以下を追加すれば、あなたが望むものを得ることができます: 'data = System.Text.RegularExpressions.Regex.Replace(data、@"(\ s *:\ s * = \ s *) "、" = ");'。私は正規表現の専門家ではないので、誰かがより良い正規表現にチャイムすることを望んでいる。 – Tung

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 
関連する問題