我想在字符串上使用Split函数,但是将分隔序列保留为字符串数组的每个元素中的第一个字符。我正在使用此函数在URL的每个实例上拆分HTML,以便我可以在网站上的URL上运行正则表达式模式。拆分功能是否有任何重载才能执行此操作?还是我必须写自己的功能?
谢谢!
答案 0 :(得分: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");
修改强>
更新为不为每个字符串添加前缀:)
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
据我所知,默认的Split方法无法做到这一点。您可以编写扩展方法来解决您的问题。或者简单地遍历字符串[]并将分隔符放在每个字符串的前面。
我会选择扩展方法:)
答案 3 :(得分:0)
答案是否定的,你不得不推出自己的版本。
可以在MSDN
上找到有关String.Split API的信息