2009-01-15 68 views
0

我想對字符串使用分割函數,但保留分隔序列作爲字符串數組中每個元素的第一個字符。我使用這個函數在URL的每個實例上分割HTML,所以我可以在網站上的URL上運行正則表達式模式。是否有任何重載的分裂功能做到這一點?還是我必須寫我自己的功能?C#中的分割變體#

謝謝!

+0

發現只是要清楚,如果你有一個字符串「富,酒吧」你想要得到的結果是串[0]「富」和字符串[1]「吧」? – BFree 2009-01-15 15:39:47

+0

您正在使用哪種版本的.NET Framework?下面建議的擴展方法在.NET 3.5 Framework中工作。 – 2009-01-15 15:43:52

回答

3

沒有內置的方法來做到這一點。如果你是在一個單一的模式,雖然分裂,這可以通過以下

public IEnumerable<string> SplitAndKeepPrefix(this string source, string delimeter) { 
    return SplitAndKeepPrefix(source, delimeter, StringSplitOptions.None); 
} 

public IEnumerable<string> SplitAndKeepPrefix(this string source, string delimeter, StringSplitOptions options) { 
    var split = source.Split(delimeter, options); 
    return split.Take(1).Concat(split.Skip(1).Select(x => delimeter + x)); 
} 

string result = htmlStr.SplitAndKeepPrefix("<a"); 

編輯

更新不前綴每個字符串:)

3
public static string[] SplitAndKeepDelimiters(this string Original, string[] Delimeters, StringSplitOptions Options) 
    { 
     var strings = EnumSplitAndKeepDelimiters(Original, Delimeters); 

     if (Options == StringSplitOptions.RemoveEmptyEntries) 
     { 
      return strings.Where((s) => s.Length != 0).ToArray(); 
     } 
     else 
     { 
      return strings.ToArray(); 
     } 
    } 

    static IEnumerable<string> EnumSplitAndKeepDelimiters(this string Original, string[] Delimeters) 
    { 
     int currIndex = 0; 

     while (currIndex < Original.Length) 
     { 
      var delimiterIndex = Delimeters.Select((d) => new { Source = d, Index = Original.IndexOf(d, currIndex) }) 
       .Where((d) => (d.Index != -1) && (d.Source != string.Empty)) 
       .OrderBy((d) => d.Index) 
       .FirstOrDefault(); 
     int nextIndex = (delimiterIndex != null) ? delimiterIndex.Index + delimiterIndex.Source.Length : Original.Length; 
      yield return Original.Substring(currIndex, nextIndex - currIndex); 
      currIndex = nextIndex; 
     } 
    } 
0

至於編碼出我知道這是不可能的默認分割方法。你可以寫一個擴展方法來解決你的問題。或者直接遍歷字符串[]並將分隔符放在每個字符串的前面。

我會去擴展方法:)

0

答案是否定的,你必須推出自己的版本。

在String.Split API的信息可以在MSDN