Регулярные выражения: создать общую группу, в которую не добавляются символы из вложенной группы. (.Net)

Приходит имя файла которое, в идеальном виде, имеет формат "[2013]Test1 [23.12.2020 13-34].zip", где:

  1. [2013] - Id (в результате должно попасть в группу "id" без "[]")
  2. Test1 - Имя файла (в результате должно попасть в группу "name")
  3. [23.12.2020 13-34] - Дата (в результате должно попасть в группу "date" без "[]")
  4. .zip - расширение (в результате должно попасть в группу "ext")

И есть ряд правил:

  1. Расширение (.zip или иное) всегда присутствует
  2. Группа "name" может быть пустой (формат [2013][23.12.2020 13-34].zip)
  3. Группы "id" и "date" необязательные и если они не найдены все должно попадать в группу "name" (форматы: "Test1 [23.12.2020 13-34].zip", "[2013]Test1 .zip", "Test1 .zip")
  4. Могут отсутствовать все группу кроме расширения (формат ".zip")

К тому-же если формат: "[]Test1 [].zip", то группа "name" = "[]Test1 []", либо формат: "Te[]st[] 1.zip", то группа "name" = "Te[]st[] 1" (Выходит символы "[" и "]" не могут быть ограничениями для группы "name").

Я пробовал решить вопрос так : (?:\[+(?'id'[0-9]*)\]+)?(?'name'[^]]*)?(?:\[+(?'data'[.\-:0-9]*)\]+)?(?'ext'\.[.a-zA-Z]+)+

При таком решение группа "name" ограничена символом "]", что не совсем подходит. Необходимо строго отслеживать отсутствие групп "id" и "date" и добавлять весь оставшийся текст в группу "name" (если вообще хоть что-то осталось). Не знаю как такого добиться, но идея в создании вложенных групп исключающие символы из базовой в случае их попадания в них.

Возможно ли вообще подобное решить с помощью регулярных выражений?

Для примеров:
[2013]Test1 [23.12.2020 13-34].zip
[2013]Test1 .zip
Test1 [23.12.2020 13-34].zip
Test1 .zip
[]Test1 [].zip
Te[]st[]1 .zip
[][].zip
[].zip
.zip

Ответы (1 шт):

Автор решения: Gunvel

Решение:

^(?:\[(?'id'[0-9]+)\])?(?'name'[^[.]+|.+)?(?:\[(?'data'[.\-:0-9 ]+)\])?(?'ext'\.[.a-zA-Z]+)+$

https://regex101.com/r/CTLULd/1

Таким способом соблюдаются условия и отрабатывают все примеры. Это мне и нужно было.

@PotroNik Спасибо. Ответ был так близок: [^\.] (иногда "глаз замыливается")

→ Ссылка