2012-07-31 151 views
0

我需要一個字符串,並基於對字符內不匹配他們繼續進行它的類型將其分割成一個數組。C#字符串分割到陣列基於先前字符

所以,如果你有「ASD FDS 1.4#3」這將分成數組,以達致這最好的辦法如下

stringArray[0] = "asd"; 
stringArray[1] = " "; 
stringArray[2] = "fds"; 
stringArray[3] = " "; 
stringArray[4] = "1"; 
stringArray[5] = "."; 
stringArray[6] = "4"; 
stringArray[7] = "#"; 
stringArray[8] = "3"; 

任何recomendations?當然,我可以創建基於.ToCharArray()循環,但一直在尋找更好的方式來實現這一目標。

謝謝

+2

你所說的「字符內的類型不匹配,他們繼續它」是什麼意思?你能否給出更多的解釋和例子? – 2012-07-31 15:26:55

+0

是啊,這是不是真的清楚你問什麼,但作爲一個側面說明,爲什麼不使用一個列表? – 2012-07-31 15:28:08

+0

這是分化?字母,數字和其他字符?或者哪些? – Marco 2012-07-31 15:34:48

回答

1

使用正則表達式和鏈接的組合,您可以執行以下操作。

using System.Text.RegularExpressions; 
using System.Linq; 

var str="asd fds 1.4#3"; 
var regex=new Regex("([A-Za-z]+)|([0-9]+)|([.#]+)|(.+?)"); 

var result=regex.Matches(str).OfType<Match>().Select(x=>x.Value).ToArray(); 

添加其他捕獲組以捕獲其他差異。最後捕獲(.+?)是一個非貪婪的一切。因此,在這個的捕捉每一個項目將被認爲是不同的(包括兩次相同的項目)

更新 - 正則表達式

var regex=new Regex(@"(?:[A-Za-z]+)|(?:[0-9]+)|(?:[#.]+)|(?:(?:(.)\1*)+?)"); 

的新修訂本現在使用非捕獲組,以便\1可以在最後的拍攝中使用。這意味着如果在同一個角色中抓住所有組,它將被分組。

例如字符串「ASD消防處」前將建立4串(每個空間將被認爲是不同的),現在的結果是3串爲2個相鄰空間被合併

+0

這明白了!謝謝!!! – Nic 2012-07-31 22:26:52

1

使用正則表達式:

var mc = Regex.Matches("asd fds 1.4#3", @"([a-zA-Z]+)|."); 
var res = new string[mc.Count]; 
for (var i = 0; i < mc.Count; i++) 
{ 
    res[i] = mc[i].Value; 
} 
1

這個程序產生正是你想要的輸出,但我不知道羯羊它是你的目標一般enaugh。

class Program 
{ 
    private static void Main(string[] args) 
    { 
     var splited = Split("asd fds 1.4#3").ToArray(); 
    } 

    public static IEnumerable<string> Split(string text) 
    { 
     StringBuilder result = new StringBuilder(); 
     foreach (var ch in text) 
     { 
      if (char.IsLetter(ch)) 
      { 
       result.Append(ch); 
      } 
      else 
      { 
       yield return result.ToString(); 
       result.Clear(); 
       yield return ch.ToString(CultureInfo.InvariantCulture); 
      } 
     } 
    } 

}