Как получить группы по повторному шаблону с помощью qantizer в регулярном выражении
У меня есть следующая строка:
(a,b,c,d,e)
Я хочу получить все значения через запятую с помощью регулярного выражения.
Если я уберу скобки
a,b,c,d,e
и используйте следующее регулярное выражение:
([^,]),?
Я получаю одно совпадение, а также одну группу для каждого значения, разделенного запятыми.
Но если я хочу сделать с заключительными скобками, используя регулярное выражение:
\((([^,]),?)+\)
Я все еще получаю только один матч и одну группу. Группа содержит только последнее значение через запятую.
Я пробовал также с групповыми захватами, как:
(?:....)
(...?)
(...)?
но я не могу получить значения через запятую группами регулярных выражений.
Как я могу это сделать, когда значения, разделенные запятыми, заключены в скобки?
2 ответа
Я узнал это. Используя C#, вы можете использовать свойство Captures в Match Match.
Используя Regex:
\((([^,]),?)+\)
Делать:
string text = "(a,b,c,d,e)";
Regex rgx = new Regex("\\((([^,]),?)+\\)");
MatchCollection matches = rgx.Matches(text);
Тогда у вас есть 1 предмет со следующими 3 группами в matchcollection:
[0]: \((([^,]),?)+\) => (a,b,c,d,e)
[1]: ([^,]),?+ => value and optional comma, eg. a, or b, or e
[2]: [^,] => value only, eg. a or b or ...
Список захватов в группе хранит каждое извлеченное значение по квантователю. Так что используйте group [2] и captures, чтобы получить все значения.
Итак, решение таково:
string text = "(a,b,c,d,e)";
Regex rgx = new Regex("\\((([^,]),?)+\\)");
MatchCollection matches = rgx.Matches(text);
//now get out the captured calues
CaptureCollection captures = matches[0].Groups[2].Captures;
//and extract them to list
List<string> values = new List<string>();
foreach (Capture capture in captures)
{
values.Add(capture.Value);
}
В общем, так работают повторяющиеся группы - у вас нет отдельных групп, только последняя. Если вы хотите разделить значения между запятыми, лучше использовать строковые функции, доступные в вашем языке программирования, чтобы сначала разделить скобки, а затем разбить строку на запятые.
Например в Ruby:
[10] pry(main)> '(a,b,c,d,e,f)'.gsub(/[()]/,'').split(',')
# => ["a", "b", "c", "d", "e", "f"]