Допустим, у меня есть список имён файлов, представляющих фильмы. Каждый mov ie определенно имеет заголовок и расширение файла, но каждое имя файла может включать 0–3 списков тегов. Список тегов - это пара круглых скобок, в которую заключены теги, разделенные запятыми; тег начинается с %
(для названий серий / франшиз), @
(для людей) или #
(для описательных тегов), и каждый вид входит в свой собственный список. Они всегда предшествуют расширению файла, между ними нет пробелов и всегда появляются в порядке (%series,%series)(@person,@person)(#tag,tag)
. Примеры:
- Casablanca.mov
- Империя наносит ответный удар (% Star Wars) .mov
- Return of the Jedi (% Star Wars) (@ George Lucas,@Carrie Фишер) .mov
- Призрачная угроза (% Star Wars,% Star Wars Prequels) (# scifi, # action) .mov
- Jurassi c Park (@Steven Spielberg) (#dinosaurs) .mov
- Titani c (#disaster) .mov
Моя цель - написать регулярное выражение с именованными группами захвата title
, serieslist
, peoplelist
и taglist
, чтобы помочь мне аккуратно извлечь все это.
Я могу управлять им, когда они все присутствуют, но я очень сбит с толку, когда дело доходит до того, чтобы сделать их необязательными, и это большое нечитаемое выражение, которое сложно проанализировать.
Вот мой лучшее усилие до сих пор. Он соответствует всем спискам тегов и подходит, если какие-либо из них отсутствуют ... но только если после заголовка есть пробел. После группы соответствия заголовка есть пробел, так что это имеет смысл. Но если я удалю это пространство из регулярного выражения, все остальные группы потерпят неудачу, и я не могу понять, почему. Я что-то не заметил? Это какая-то ленивая / жадная вещь, которую мне не хватает?
(?<title>.+) (?:\((?<series>%[^)]+)?\))?(?:\((?<people>@[^)]+)?\))?(?:\((?<tags>#.+)\))?(?<extension>\.[^.]+)$
Вот моя страница Regex101 с набором модульных тестов на вкладке «переключиться на модульные тесты», надеюсь, те имеет больше смысла, чем мое описание.
Большое спасибо всем, кто может помочь мне осознать мою ошибку.