Строковое разделение C# - разбивающий строку во второй запятой

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

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

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

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

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

Спасибо за помощь

Столкновения

8
задан Riain McAtamney 15 July 2010 в 10:48
поделиться

7 ответов

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

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

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

9
ответ дан 5 December 2019 в 09:23
поделиться

Нет прямого способа заставить 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 или с помощью регулярного выражения.

5
ответ дан 5 December 2019 в 09:23
поделиться

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

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

0
ответ дан 5 December 2019 в 09:23
поделиться

с использованием 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
ответ дан 5 December 2019 в 09:23
поделиться

Не только с 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();
1
ответ дан 5 December 2019 в 09:23
поделиться

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

1
ответ дан 5 December 2019 в 09:23
поделиться

Здесь еще одно решение на основе 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));
}
2
ответ дан 5 December 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: