Регулярные выражения: создать общую группу, в которую не добавляются символы из вложенной группы. (.Net)
Приходит имя файла которое, в идеальном виде, имеет формат "[2013]Test1 [23.12.2020 13-34].zip", где:
- [2013] - Id (в результате должно попасть в группу "id" без "[]")
- Test1 - Имя файла (в результате должно попасть в группу "name")
- [23.12.2020 13-34] - Дата (в результате должно попасть в группу "date" без "[]")
- .zip - расширение (в результате должно попасть в группу "ext")
И есть ряд правил:
- Расширение (.zip или иное) всегда присутствует
- Группа "name" может быть пустой (формат [2013][23.12.2020 13-34].zip)
- Группы "id" и "date" необязательные и если они не найдены все должно попадать в группу "name" (форматы: "Test1 [23.12.2020 13-34].zip", "[2013]Test1 .zip", "Test1 .zip")
- Могут отсутствовать все группу кроме расширения (формат ".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 шт):
Решение:
^(?:\[(?'id'[0-9]+)\])?(?'name'[^[.]+|.+)?(?:\[(?'data'[.\-:0-9 ]+)\])?(?'ext'\.[.a-zA-Z]+)+$
https://regex101.com/r/CTLULd/1
Таким способом соблюдаются условия и отрабатывают все примеры. Это мне и нужно было.
@PotroNik Спасибо. Ответ был так близок: [^\.] (иногда "глаз замыливается")