Regex: произвольное количество групп захвата с заданными аргументами - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь написать скрипт для организации моей библиотеки mov ie. Все мои фильмы хранятся с одним и тем же шаблоном

Mov ie Имя [4-DI GIT -ГОД, ЯЗЫК +, SUB LANGUAGE *]

где «+» означает один или несколько аргументов, а «*» ноль или более (чтобы соответствовать нотации регулярного выражения). Я подумал написать регулярное выражение для соответствия этим шаблонам, и я протестировал его здесь . Выражение, которое я придумал:

^(?!\n)
([{a-z}{A-Z}\d\s\-\:\"\.àèéòùì]+)
\s
\[([\d]{4})(?:\,\s)
(?:(ITA|ENG|JAP)
(?:\,\s)?)+(SUB (?:ITA|ENG|JAP)
(?:\,\s)?)*\]$

Кажется, оно выполняет свою работу в сопоставлении, но мне не удается захватить все языки. Если вы видите в примере # 2

Spirited Away [2001, ENG, SUB ITA, SUB ENG]

mov ie подбирается так, как я хочу, но захваты

Полное совпадение Унесенные призраками [2001, ENG, SUB ITA, SUB ENG]

Группа 1. Унесенные призраками

Группа 2. 2001

Группа 3. ENG

Группа 4. SUB ENG

Как видно, сопоставляются только последние сабвуферы, и то же самое происходит в последнем примере для языка, где захватывается только JAP. Как я могу захватить все данные, а не только последние? Заранее спасибо за любые ответы.

РЕДАКТИРОВАТЬ: сценарий на C ++, поэтому регулярное выражение будет использовать синтаксис ECMAScript.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020
^([^[]*\S) \[(\d{4}), ((?:[A-Z]+(?:, (?!SUB)|))+|)(?:, |)((?:SUB [A-Z]+(?:, |))+|)\]$

https://regex101.com/r/8PiLN0/4


Группы 3 и 4 содержат разделенные запятыми списки языков.

При желании вы можете разбить эти строки на массивы.


Поскольку разные языки программирования используют разный синтаксис регулярных выражений, вам может потребоваться переписать шаблон регулярных выражений в используемый вами синтаксис.

0 голосов
/ 05 апреля 2020

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

Обратите внимание, что [{a-z}{A-Z}] совпадает с [a-zA-Z{}]

Опираясь на ваш шаблон, он может выглядеть следующим образом:

^(?!\n)([a-zA-Z\d\s\-:".àèéòùì]+)\s\[(\d{4}),\s((?:ITA|ENG|JAP)(?:,\s(?:SUB\s)?(?:ITA|SUB|ENG|JAP))*)\]
  • ^ Начало строки
  • (?!\n) Не указывать символ новой строки справа
  • ([a-zA-Z\d\s\-:".àèéòùì]+) Захват группа 1 , соответствует одному из перечисленных
  • \s\[ Совпадение с пробельным символом и [
  • (\d{4}) Захват группа 2 , соответствует 4 цифрам
  • ,\s Соответствует запятой и символу пробела
  • ( Capture группа 3 , соответствует 1 из альтернатив
    • (?:ITA|ENG|JAP)
    • (?:,\s Группа без захвата, запятая и пробел
  • (?:SUB\s)? Опционально. совпадение SUB и символ пробела
  • (?:ITA|SUB|ENG|JAP) Сопоставить с любой из альтернатив
  • )* Закрыть группу без захвата и повторить 0+ раз, чтобы получить все языки
  • ) Закрыть группу 3
  • \] Соответствовать ] char

Regex demo

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