C#字符串拆分 - 在第二个逗号处打破字符串

时间:2010-07-15 10:28:57

标签: c# string split

我有一个像这样的字符串:

mystring = "test1, 1, anotherstring, 5, yetanother, 400";

myarray可以有不同的长度。我想做的是将字符串拆分为:

{"test1, 1"} 
{"anotherstring, 5}
{"yetanother, 400"}

这可能吗?我试过string[] newArray = mystring.Split(','),但是它会在每个逗号分开,而不是我想做的第二个逗号。

感谢您的帮助

的ZAP

7 个答案:

答案 0 :(得分:9)

您可以使用正则表达式匹配字符串中的两个项目:

string[] parts =
  Regex.Matches(myarray[0], "([^,]*,[^,]*)(?:, |$)")
  .Cast<Match>()
  .Select(m => m.Groups[1].Value)
  .ToArray();

这将从数组中的第一个字符串中获取项目。我不知道你为什么在数组中有字符串,如果你有多个字符串,那么你必须循环遍历它们并从每个字符串中获取项目。

答案 1 :(得分:5)

没有直接的方法让String.Split这样做。

如果不考虑性能,可以使用LINQ:

var input = "test1, 1, anotherstring, 5, yetanother, 400";

string[] result = input.Split(',');
result = result.Where((s, i) => i % 2 == 0)
               .Zip(result.Where((s, i) => i % 2 == 1), (a, b) => a + ", " + b)
               .ToArray();

否则,您可能必须使用String.IndexOf或使用正则表达式手动拆分字符串。

答案 2 :(得分:2)

这里有另一个基于LINQ的解决方案。 (也许不是最有效的,但它允许简洁的代码并适用于分组为任意组大小)。


1)定义新的查询运算符InGroupsOf

public static IEnumerable<T[]> InGroupsOf<T>(this IEnumerable<T> parts,
                                             int groupSize)
{
    IEnumerable<T> partsLeft = parts;
    while (partsLeft.Count() >= groupSize)
    {
        yield return partsLeft.Take(groupSize).ToArray<T>();
        partsLeft = partsLeft.Skip(groupSize);
    }
}

2)其次,将其应用于您的输入:

// define your input string:
string input = "test1, 1, anotherstring, 5, yetanother, 400";

// split it, remove excessive whitespace from all parts, and group them together:
IEnumerable<string[]> pairedInput = input
                                    .Split(',')
                                    .Select(part => part.Trim())
                                    .InGroupsOf(2);  // <-- used here!

// see if it worked:
foreach (string[] pair in pairedInput)
{
    Console.WriteLine(string.Join(", ", pair));
}

答案 3 :(得分:1)

单独使用Split,但肯定可以实现。

我认为myarray实际上是一个字符串,而不是数组......?

在这种情况下,你可以这样做:

string myarray = "test1, 1, anotherstring, 5, yetanother, 400";

string[] sourceArray = myarray.Split(',');
string[] newArray = sourceArray.Select((s,i) =>
   (i % 2 == 0) ? "" : string.Concat(sourceArray[i-1], ",", s).Trim()
).Where(s => !String.IsNullOrEmpty(s)).ToArray();

答案 4 :(得分:1)

你可以在原始字符串上使用正则表达式来用其他'令牌'替换所有其他逗号,例如';' 然后只需在新令牌上调用string.split。

答案 5 :(得分:0)

有趣的问题......我会这样做:

string input = "test1, 1, anotherstring, 5, yetanother, 400";
string pattern = @"([^,]*,[^,]*),";

string[] substrings = Regex.Split(input, pattern).Where(s => s!="").Select(s => s.Trim()).ToArray();

你得到了你想要的。只有它的脏...... = P =)

答案 6 :(得分:0)

使用IEnumerator ..

       var myarray = "test1, 1, anotherstring, 5, yetanother, 400";
       System.Collections.IEnumerator iEN = myarray.Split(',').GetEnumerator();
       var strList = new List<string>();
       while (iEN.MoveNext())
       {
           var first = iEN.Current;
           iEN.MoveNext();
           strList.Add((string)first + "," + (string)iEN.Current);
       }

:)