拆分字符串并保留分隔符而不使用Regex C#

时间:2016-01-18 16:56:36

标签: c# string split

问题:花费太多时间解决简单问题。哦,这是一个简单的问题。

  • 输入:string inStrchar delimiter
  • 输出:string[] outStrs其中string.Join("", outStrs) == inStr和最后一项之前的outStrs中的每个项目必须以分隔符结束。如果inStr以分隔符结尾,则outStrs中的最后一项也会以分隔符结束。

示例1:

  • 输入:"my,string,separated,by,commas"','
  • 输出:["my,", "string,", "separated,", "by,", "commas"]

示例2:

  • 输入:"my,string,separated,by,commas,"','
  • 输出:["my,", "string,", "separated,", "by,", "commas,"](通知尾随逗号)

正则表达式解决方案:here

我想避免使用正则表达式,因为这只需要进行字符比较。它在算法上与string.Split()所做的一样复杂。令我困扰的是,我无法找到一种更简洁的方式来做我想做的事。

我的糟糕解决方案,对我不起作用......它应该更快,更简洁。

var outStr = inStr.Split(new[]{delimiter}, 
                         StringSplitOptions.RemoveEmptyEntries)
                  .Select(x => x + delimiter).ToArray();
if (inStr.Last() != delimiter) {
    var lastOutStr = outStr.Last();
    outStr[outStr.Length-1] = lastOutStr.Substring(0, lastOutStr.Length-1);
}

3 个答案:

答案 0 :(得分:2)

使用LINQ:

string[] output = (input + ',').Split( new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
    .Select(x => x + ',').ToArray();

将字符串拆分成组,然后通过向其添加逗号来转换不是最后一个元素的每个组。

想到另一种方法可以做到,但我不认为这种方法很清楚:

<button class="btn" onclick="appModel.subscribe()">SUBSCRIBE</button>
<button class="btn" onclick="appModel.unsubscribe()">UNSUBSCRIBE</button>

答案 1 :(得分:0)

如果不使用正则表达式,我似乎很简单:

string inStr = "dasdasdas";
char delimiter = 'A';
string[] result = inStr.Split(new string[] { inStr }, System.StringSplitOptions.RemoveEmptyEntries);
string lastItem = result[result.Length - 1];
int amountOfLoops = lastItem[lastItem.Length - 1] == delimiter ? result.Length - 1 : result.Length - 2;
for (int i = 0; i < amountOfLoops; i++)
{
    result[i] += delimiter;
}

答案 2 :(得分:0)

public static IEnumerable<string> SplitAndKeep(this string s, string[] delims)
    {
        int start = 0, index;
        string selectedSeperator = null;
        while ((index = s.IndexOfAny(delims, start, out selectedSeperator)) != -1)
        {
            if (selectedSeperator == null)
                continue;
            if (index - start > 0)
                yield return s.Substring(start, index - start);
            yield return s.Substring(index, selectedSeperator.Length);
            start = index + selectedSeperator.Length;
        }

        if (start < s.Length)
        {
            yield return s.Substring(start);
        }
    }