使用分隔符拆分字符串,但在C#中保留结果中的分隔符

oli*_*dev 20 c# string split

我想用分隔符拆分一个字符串,但在结果中保留分隔符.

我怎么用C#做这个?

veg*_*rby 22

如果您希望分隔符为"自己的分割",则可以使用Regex.Split,例如:

string input = "plum-pear";
string pattern = "(-)";

string[] substrings = Regex.Split(input, pattern);    // Split on hyphens
foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}
// The method writes the following to the console:
//    'plum'
//    '-'
//    'pear'
Run Code Online (Sandbox Code Playgroud)

  • 你好。谢谢。这就是我想要的。我先测试一下。谢谢。但是有没有比使用 Regex 更好的方法? (2认同)
  • 潜在的陷阱:他在示例中使用的括号是必需的。Regex.Split(“ plum-pear”,“-”)仅产生'plum'和'pear'。编程很有趣。 (2认同)

Ron*_*Ron 5

此版本不使用LINQ或Regex,因此可能相对有效。我认为它可能比Regex更容易使用,因为您不必担心转义特殊的分隔符。它返回的an IList<string>比总是转换为数组更有效。这是一种扩展方法,非常方便。您可以将定界符作为数组或多个参数传入。

/// <summary>
/// Splits the given string into a list of substrings, while outputting the splitting
/// delimiters (each in its own string) as well. It's just like String.Split() except
/// the delimiters are preserved. No empty strings are output.</summary>
/// <param name="s">String to parse. Can be null or empty.</param>
/// <param name="delimiters">The delimiting characters. Can be an empty array.</param>
/// <returns></returns>
public static IList<string> SplitAndKeepDelimiters(this string s, params char[] delimiters)
{
    var parts = new List<string>();
    if (!string.IsNullOrEmpty(s))
    {
        int iFirst = 0;
        do
        {
            int iLast = s.IndexOfAny(delimiters, iFirst);
            if (iLast >= 0)
            {
                if (iLast > iFirst)
                    parts.Add(s.Substring(iFirst, iLast - iFirst)); //part before the delimiter
                parts.Add(new string(s[iLast], 1));//the delimiter
                iFirst = iLast + 1;
                continue;
            }

            //No delimiters were found, but at least one character remains. Add the rest and stop.
            parts.Add(s.Substring(iFirst, s.Length - iFirst));
            break;

        } while (iFirst < s.Length);
    }

    return parts;
}
Run Code Online (Sandbox Code Playgroud)

一些单元测试:

text = "[a link|http://www.google.com]";
result = text.SplitAndKeepDelimiters('[', '|', ']');
Assert.IsTrue(result.Count == 5);
Assert.AreEqual(result[0], "[");
Assert.AreEqual(result[1], "a link");
Assert.AreEqual(result[2], "|");
Assert.AreEqual(result[3], "http://www.google.com");
Assert.AreEqual(result[4], "]");
Run Code Online (Sandbox Code Playgroud)


max*_*axp 5

这个问题有很多答案!我敲了一个被各种字符串拆分的字符串(原始答案仅适用于字符,即长度为 1)。这还没有经过全面测试。

public static IEnumerable<string> SplitAndKeep(string s, params string[] delims)
{
    var rows = new List<string>() { s };
    foreach (string delim in delims)//delimiter counter
    {
        for (int i = 0; i < rows.Count; i++)//row counter
        {
            int index = rows[i].IndexOf(delim);
            if (index > -1
                && rows[i].Length > index + 1)
            {
                string leftPart = rows[i].Substring(0, index + delim.Length);
                string rightPart = rows[i].Substring(index + delim.Length);
                rows[i] = leftPart;
                rows.Insert(i + 1, rightPart);
            }
        }
    }
    return rows;
}
Run Code Online (Sandbox Code Playgroud)