Почему мои названные группы захвата не работают? - PullRequest
0 голосов
/ 07 мая 2020

Допустим, у меня есть список имён файлов, представляющих фильмы. Каждый 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 с набором модульных тестов на вкладке «переключиться на модульные тесты», надеюсь, те имеет больше смысла, чем мое описание.

Большое спасибо всем, кто может помочь мне осознать мою ошибку.

1 Ответ

0 голосов
/ 11 мая 2020

Вы можете использовать это регулярное выражение:

(?<title>.+?)[ ]*(?:\((?<series>%[^)]+)\)|\((?<people>@[^)]+)\)|\((?<tags>#[^)]+)\))*(?<extension>\.[^.]+)$

Демонстрация на regex101

Серии, люди и группы захвата тегов помещаются в чередование, которые затем повторяются, чтобы можно было гибко упорядочивать эти 3 элемента. Это позволит использовать несколько тегов в имени, но захватывается только последний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...