11

我想要做的是在字符串的第 n 次出现时拆分(在本例中为“\t”)。这是我目前正在使用的代码,它在每次出现“\t”时都会拆分。

string[] items = input.Split(new char[] {'\t'}, StringSplitOptions.RemoveEmptyEntries);

如果 input = "one\ttwo\tthree\tfour",我的代码返回数组:

但是假设我想在第二个“\t”之后的每个“\t”上拆分它。所以,它应该返回:

  • 一二
4

4 回答 4

19

没有内置任何东西。

您可以使用现有的Split、使用TakeSkipstring.Join来重建您最初拥有的部分。

string[] items = input.Split(new char[] {'\t'}, 
                             StringSplitOptions.RemoveEmptyEntries);
string firstPart = string.Join("\t", items.Take(nthOccurrence));
string secondPart = string.Join("\t", items.Skip(nthOccurrence))

string[] everythingSplitAfterNthOccurence = items.Skip(nthOccurrence).ToArray();

另一种方法是遍历字符串中的所有字符,找到第 n 次出现的索引和它之前和之后的子字符串(或者在第 n 次之后找到下一个索引,子字符串等等......等等......等等。 .)。

于 2013-04-16T10:40:31.063 回答
4

[编辑] 重新阅读编辑后的 ​​OP 后,我意识到这并不能满足现在的要求。这将在每个第 n 个目标上拆分;OP 希望在第 n 个目标之后拆分每个目标。

无论如何,我将把它留在这里以供后代使用。


如果您使用的是MoreLinq 扩展,您可以利用它的Batch方法。

您的代码将如下所示:

string text = "1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17";

var splits = text.Split('\t').Batch(5);

foreach (var split in splits)
    Console.WriteLine(string.Join("", split));

我可能只是使用 Oded 的实现,但我想我会发布这个作为替代方法。

的实现Batch()看起来像这样:

public static class EnumerableExt
{
    public static IEnumerable<IEnumerable<TSource>> Batch<TSource>(this IEnumerable<TSource> source, int size)
    {
        TSource[] bucket = null;
        var count = 0;

        foreach (var item in source)
        {
            if (bucket == null)
                bucket = new TSource[size];

            bucket[count++] = item;

            if (count != size)
                continue;

            yield return bucket;

            bucket = null;
            count = 0;
        }

        if (bucket != null && count > 0)
            yield return bucket.Take(count);
    }
}
于 2013-04-16T10:44:58.253 回答
1

您很可能必须拆分和重新组合。就像是

int tabIndexToRemove = 3;
string str = "My\tstring\twith\tloads\tof\ttabs";
string[] strArr = str.Split('\t');
int numOfTabs = strArr.Length - 1;
if (tabIndexToRemove > numOfTabs)
    throw new IndexOutOfRangeException();
str = String.Empty;
for (int i = 0; i < strArr.Length; i++)
    str += i == tabIndexToRemove - 1 ? 
        strArr[i] : String.Format("{0}\t", strArr[i]);

结果:

我的字符串带有许多标签

我希望这有帮助。

于 2013-04-16T10:43:34.180 回答
0
// Return a substring of str upto but not including
// the nth occurence of substr
function getNth(str, substr, n) {
  var idx;
  var i = 0;
  var newstr = '';
  do {
    idx = s.indexOf(c);
    newstr += str.substring(0, idx);
    str = str.substring(idx+1);
  } while (++i < n && (newstr += substr))
  return newstr;
}
于 2013-04-16T10:44:50.407 回答