Как получить группы по повторному шаблону с помощью 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"]
Другие вопросы по тегам