2009-03-11 9 views
1

Je voudrais diviser une chaîne supprimée par un caractère tel que '&', mais dans le cas où certaines valeurs contiennent le suppresseur, je voudrais échapper avec des guillemets doubles. Qu'est-ce qu'une approche élégante du découpage en ignorant les caractères éliminatoires qui ont été échappés tout en tenant compte des évasions de caractères d'échappement?Comment diviser une chaîne supprimée avec l'encapsulation et les échappements

Par exemple diviser cette chaîne correctement

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

en:

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

Soit dit en passant, je pense ... Regex

+0

Y at-il une raison particulière pour laquelle vous voulez utiliser la double-citation comme caractère d'échappement? Dans votre exemple, vous semblez seulement l'utiliser pour échapper à lui-même. Aussi devrait-il y avoir un & entre "delim" 'et' var4 = '? – Lazarus

+0

Les caractères eux-mêmes sont en fait arbitraires, ce qui est la valeur par défaut cependant, et oui, ils devraient être un entre, ty! :) – ccook

+0

Apparaît être un dupliquer de [celui-ci] (http://stackoverflow.com/questions/634777/c-extension-method-string-split-that-also-accepts-an-escape-character/) C'est deux questions très similaires au sujet d'un Est-ce un défi de programmation sur le blog de quelqu'un? –

Répondre

0

Ma solution, avec le 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; 
    } 
Questions connexes