C # String split - разрыв строки во второй запятой - PullRequest
8 голосов
/ 15 июля 2010

У меня есть такая строка:

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

myarray может быть различной длины. То, что я хотел бы сделать, это разделить строку следующим образом:

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

Возможно ли это? Я попытался string[] newArray = mystring.Split(','), но это разделяет его на каждую запятую, а не на вторую запятую, что я хотел бы сделать.

Спасибо за вашу помощь

1012 * хочет подарить Петербургу *

Ответы [ 7 ]

9 голосов
/ 15 июля 2010

Вы можете использовать регулярное выражение для сопоставления двух элементов в строке:

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

Это получает элементы из первой строки в массиве. Я не знаю, почему у вас есть строка в массиве, и если у вас есть более одной строки, в этом случае вы должны пройти через них и получить элементы из каждой строки.

5 голосов
/ 15 июля 2010

Нет прямого способа заставить 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 голосов
/ 15 июля 2010

Еще одно решение на основе 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));
}
1 голос
/ 15 июля 2010

Вы, вероятно, можете использовать регулярное выражение в исходной строке, чтобы заменить каждую другую запятую другим 'токеном', например ';'Затем просто вызовите string.split для нового токена.

1 голос
/ 15 июля 2010

Не только 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();
0 голосов
/ 15 июля 2010

с использованием 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);
       }

:)

0 голосов
/ 15 июля 2010

Интересный вопрос ... Я бы сделал это так:

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 =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...