Как мне разделить строку на символ, но только тогда, когда он не содержится в круглых скобках?

#c# #regex

#c# #регулярное выражение

Вопрос:

Ввод: ((Why,Heck),(Ask,Me),(Bla,No))

Как я могу разделить эти данные на строковый массив:

   Element1  (Why,Heck)
  Element2  (Ask,Me)
  Element3  (Bla,No)
  

Я попробовал строку.Разделение или строка.Обрезать / Начать, но нет никаких шансов, что результат всегда будет неправильным.

Было бы лучше с регулярным выражением?

Комментарии:

1. I tried the String.Split or String.TrimEnd/Start but no chance the result is always wrong. что вы пробовали? Почему этого нет в вопросе?

Ответ №1:

 var input = "((Why,Heck),(Ask,Me),(Bla,No))";

var result = Regex.Matches(input, @"([^()] ?)")
                  .Cast<Match>()
                  .Select(m => m.Value)
                  .ToList();
  

Комментарии:

1. Проверено с использованием этого derekslager.com/blog/posts/2007/09/… это правильно, за исключением одной вещи. Он соответствует самым первым скобкам: ((Why,Heck)

2. можете ли вы исправить ошибку, из-за которой она совпадает с первыми круглыми скобками?

3. @Pheonixblade9 исправлено.

4. Вы можете упростить: @"([^(] ?)" .

5. Хороший ответ, но к вашему сведению, вам больше не нужно использовать квантификатор с отказом, и вам не нужно экранировать круглые скобки в классе символов.

Ответ №2:

Другой — нерегулярный подход, который должен работать:

 string[] result = str.Split(new[]{"),"}, StringSplitOptions.None)
     .Select(s => string.Format("({0})", s.Trim('(', ')')))
     .ToArray();
  

ДЕМОНСТРАЦИЯ

Ответ №3:

вы также могли бы:

  1. удалите все круглые скобки, чтобы упростить разделение
  2. разделить на ‘,’
  3. Прочитайте возвращенный массив группами по два. Для этого используется цикл for или аналогичный рекурсивный алгоритм, получаем индексы 0 и 1, 2 и 3 и т. Д.
  4. Реконструировать с помощью круглых скобок

Или вы могли бы просто использовать регулярные выражения