C#中的String.Split变体

时间:2009-01-15 15:33:56

标签: c# string

我想在字符串上使用Split函数,但是将分隔序列保留为字符串数组的每个元素中的第一个字符。我正在使用此函数在URL的每个实例上拆分HTML,以便我可以在网站上的URL上运行正则表达式模式。拆分功能是否有任何重载才能执行此操作?还是我必须写自己的功能?

谢谢!

4 个答案:

答案 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的信息