2009-03-11 12 views
1

Ich möchte eine Zeichenfolge getrennt durch ein Zeichen wie "&" teilen, aber in dem Fall, wo einige Werte den Begrenzer enthalten, möchte ich mit doppelten Anführungszeichen entkommen. Was ist ein eleganter Ansatz zum Aufspalten, während die entkämmenden Zeichen, die maskiert wurden, ignoriert werden, während auch Escape-Zeichen-Fluchten berücksichtigt werden?Wie man eine begrenzte Zeichenkette mit Verkapselung und Escapes teilt

Zum Beispiel spalten diese Zeichenfolge richtig

var1=asdfasdf&var2=contain””quote&var3=”contain&delim”&var4=”contain””both&” 

In:

var1=asdfasdf 
var2=contain"quote 
var3=contain&delim 
var4=contain"both& 

Übrigens denke ich Regex ...

+0

Gibt es einen besonderen Grund dafür? Sie möchten das Doppelzitat als Escape-Zeichen verwenden? In Ihrem Beispiel scheinen Sie es nur zu benutzen, um sich selbst zu entkommen. Auch sollte es ein & zwischen 'delim' 'und' var4 = 'geben? – Lazarus

+0

Die Zeichen sie selbst sind eigentlich willkürlich, das ist die Vorgabe jedoch. Und ja, sie sollten eins zwischen, ty! Sein :) – ccook

+0

Scheint, ein zu sein Duplikat von [diesem] (http://stackoverflow.com/questions/634777/c-extension-method-string-split-that-also-accepts-an-escape-character/) Das sind zwei sehr ähnliche Fragen innerhalb von ca. Stunde: Ist das eine Programmierherausforderung auf jemandes Blog? –

Antwort

0

Meine Lösung, mit Test:

void TestCharlesParse() 
    { 
     string s = @"var1=asdfasdf&var2=contain""""quote&var3=""contain&delim""&var4=""contain""""both&"""; 
     string[] os = CharlesParse(s); 

     for (int i = 0; i < os.Length; i++) 
      System.Windows.Forms.MessageBox.Show(os[i]); 
    } 

    string[] CharlesParse(string inputString) 
    { 
     string[] escapedQuotes = { "\"\"" }; 

     string[] sep1 = inputString.Split(escapedQuotes, StringSplitOptions.None); 

     bool quoted = false; 
     ArrayList sep2 = new ArrayList(); 
     for (int i = 0; i < sep1.Length; i++) 
     { 
      string[] sep3 = ((string)sep1[i]).Split('"'); 
      for (int j = 0; j < sep3.Length; j++) 
      { 
       if (!quoted) 
       { 
        string[] sep4 = sep3[j].Split('&'); 
        for (int k = 0; k < sep4.Length; k++) 
        { 
         if (k == 0) 
         { 
          if (sep2.Count == 0) 
          { 
           sep2.Add(sep4[k]); 
          } 
          else 
          { 
           sep2[sep2.Count - 1] = ((string)sep2[sep2.Count - 1]) + sep4[k]; 
          } 
         } 
         else 
         { 
          sep2.Add(sep4[k]); 
         } 
        } 
       } 
       else 
       { 
        sep2[sep2.Count - 1] = ((string)sep2[sep2.Count - 1]) + sep3[j]; 
       } 
       if (j < (sep3.Length-1)) 
        quoted = !quoted; 
      } 
      if (i < (sep1.Length - 1)) 
       sep2[sep2.Count - 1] = ((string)sep2[sep2.Count - 1]) + "\""; 
     } 

     string[] ret = new string[sep2.Count]; 
     for (int l = 0; l < sep2.Count; l++) 
      ret[l] = (string)sep2[l]; 

     return ret; 
    } 
Verwandte Themen