我想對字符串使用分割函數,但保留分隔序列作爲字符串數組中每個元素的第一個字符。我使用這個函數在URL的每個實例上分割HTML,所以我可以在網站上的URL上運行正則表達式模式。是否有任何重載的分裂功能做到這一點?還是我必須寫我自己的功能?C#中的分割變體#
謝謝!
我想對字符串使用分割函數,但保留分隔序列作爲字符串數組中每個元素的第一個字符。我使用這個函數在URL的每個實例上分割HTML,所以我可以在網站上的URL上運行正則表達式模式。是否有任何重載的分裂功能做到這一點?還是我必須寫我自己的功能?C#中的分割變體#
謝謝!
沒有內置的方法來做到這一點。如果你是在一個單一的模式,雖然分裂,這可以通過以下
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");
編輯
更新不前綴每個字符串:)
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;
}
}
至於編碼出我知道這是不可能的默認分割方法。你可以寫一個擴展方法來解決你的問題。或者直接遍歷字符串[]並將分隔符放在每個字符串的前面。
我會去擴展方法:)
答案是否定的,你必須推出自己的版本。
在String.Split API的信息可以在MSDN
發現只是要清楚,如果你有一個字符串「富,酒吧」你想要得到的結果是串[0]「富」和字符串[1]「吧」? – BFree 2009-01-15 15:39:47
您正在使用哪種版本的.NET Framework?下面建議的擴展方法在.NET 3.5 Framework中工作。 – 2009-01-15 15:43:52