2012-07-31 72 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); 
      } 
     } 
    } 

}