2013-09-24 13 views
5

Szukam znaleźć sposób, aby podzielić alfanumeryczny ciąg jakPodział ciąg alfanumeryczny do tablicy zawierającej alfabetu i cyfry oddzielnie

"Foo123Bar" 

do tablicy zawierającej go jak tak

array[0] = "Foo" 
array[1] = "123" 
array[2] = "Bar" 

Nie jestem pewien, jaki jest najlepszy sposób, aby to osiągnąć, szczególnie dlatego, że ciągi, które porównuję, nie podążają za żadnym konkretnym wzorcem, o ile jest to pierwsze, alfabetem lub cyframi, ani ile razy się one pojawiają. Na przykład może to wyglądać jak każdy z następujących powodów:

"Foo123Bar" 
"123Bar" 
"Foobar123" 
"Foo123Bar2" 

Próbuję dowiedzieć się, czy istnieje bardziej skuteczny sposób w ten sposób inny niż podział charakter ciąg o charakterze i sprawdzając, czy jest to numeryczny .

+0

Co powinno być wynikiem '' "Foobar123", powinno być 'Foo',' '123' i bar' lub' '123' i Foobar' – Habib

+0

Wynikiem '' Foobar123 "' powinno być '" Foobar "' i '" 123 "'. – Nvx

Odpowiedz

11
string input = "Foo123Bar"; 
var array = Regex.Matches(input, @"\D+|\d+") 
       .Cast<Match>() 
       .Select(m => m.Value) 
       .ToArray(); 
+1

To rozwiązuje problem doskonale, dzięki bardzo! – Nvx

0

Nie sądzę, że obejdzie się sprawdzanie każdej litery napisu.
można spróbować coś takiego:

string[] SplitMyString(string s) 
{ 
    if(s.Length == 0) 
    return new string[0]; 

    List<string> split = new List<string>(1); 
    split.Add(""); 

    bool isNumeric = s[0] >= '0' && s[0] <= '9'; 
    foreach(char c in s) 
    { 
    bool AddString = false; 
    if(c >= '0' && c <= '9') 
    { 
     AddString = !isNumeric; 
     isNumeric = true; 
    } 
    else 
    { 
     AddString = isNumeric; 
     isNumeric = false; 
    } 
    if(AddString) 
     split.Add(c.ToString()); 
    else 
     split[split.Count-1] += c; 
    } 
    return split.ToArray(); 
}