Чес. Оуэнс прав в своем комментарии. Но для простых случаев вы можете использовать следующее регулярное выражение:
switch\s*\((?<expression>[^\)]+)\)\s*\{\s*((default(?<case>)|case\s*(?<case>"[^"]*"|'[^']*'|\w+))\s*:\s*(?<body>((?!\s*(case\b|default\b|\}))("[^"]*"|'[^']*'|[^\}]))*)\s*)+\}
Чтобы использовать его, движок регулярных выражений, который вы используете, должен поддерживать явные множественные именованные захваты и упреждения (например, движок регулярных выражений .NET). Обратите внимание, что все группы, кроме названных групп, могут быть сделаны без захвата, но для того, чтобы упростить понимание регулярного выражения, я не добавил "?:" В начале группы, чтобы сделать их группами без захвата. *
Затем вы получите одно совпадение для каждого распознанного оператора switch
со следующими захватами:
выражение: выражение, используемое для коммутатора (1 захват)
case: метка регистра или пусто (но успешный захват) для значения по умолчанию
body: корпус, по одному на каждый кейс
регистр и тело всегда будут приходить парами, так что вы можете перечислять их по снимкам.