Вам нужно немного разбираться в выполнении регулярных выражений, чтобы иметь возможность создавать что-то подобное, и когда дело доходит до повторений (в частности, разделенных запятыми списков), вам часто приходится делать немного больше. Это должно сработать.
([^-]+-[^,]+)(,[^-]+-[^,]+)*
Когда вы пишете регулярное выражение, вы создаете очень простой синтаксический анализатор, который будет жадно потреблять символы слева направо. Это накладывает определенные ограничения на то, как вы пишете свое регулярное выражение.
Этот фрагмент соответствует следующему.
- Подберите группу, которая начинается с любого количества не заштрихованных символов, за которым следует фактический дефис, за которым следует любое количество не запятых символов, создайте группу для этого соответствия
- Следующая группа немного интересна, потому что совпадение должно быть успешным только при наличии запятой, разделяющей пары. Перед второй группой запятой вы указываете движку регулярных выражений продолжать работу только при наличии запятой. Остальное точно идентично.
Причина, по которой каждый класс символов является чем-то иным, кроме разделителя, заключается в том, что жадный механизм регулярных выражений в противном случае не понял бы, что необходимо принять решение, учитывая текущий импульс. Большинство проблем с регулярными выражениями связано с неудачным пониманием жадной природы регулярных выражений (есть и ленивые движки, но они медленнее и не совсем стандартное регулярное выражение)
Вы можете переписать шаблон так, чтобы он стал более практичным в использовании:
(?:(?<key>[^-]+)-(?<value>[^,]+))(?:,(?<key>[^-]+)-(?<value>[^,]+))*