#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:
вы также могли бы:
- удалите все круглые скобки, чтобы упростить разделение
- разделить на ‘,’
- Прочитайте возвращенный массив группами по два. Для этого используется цикл for или аналогичный рекурсивный алгоритм, получаем индексы 0 и 1, 2 и 3 и т. Д.
- Реконструировать с помощью круглых скобок
Или вы могли бы просто использовать регулярные выражения