Regex: как опционально захватить группу

Я пытаюсь сделать подстроку необязательной. Вот 9X_regex источник:

Movie TOTO S09 E22 2022 Copyright

Я хочу дополнительно захватить 9X_regexp подстроку: S09 E22

Что я пробовал до сих пор:

/(Movie)(.*)(S\d\d\s*E\d\d)?/gmi

Проблема 9X_regexes в том, что он заканчивается совпадением 9X_regex S09 E22 2022 Copyright вместо простого S09 E22 :

Match 1 : 0-33  Movie TOTO S09 E22 2022 Copyright 
Group 1 : 0-5   Movie
Group 2:  5-33   TOTO S09 E22 2022 Copyright

Можно ли как-то решить 9X_apache-regexp эту проблему?

С уважением

6
0
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Regex: как опционально захватить группу

Вы получаете это совпадение, потому что 9X_regex-php .* является жадным и будет сначала соответствовать 9X_regularexpression до конца строки.

Тогда ваш (S\d\d\s*E\d\d)? не является обязательным, поэтому 9X_apache-regexp он останется совпадающим и не будет отступать.

Если 9X_regex вам не нужны частичные совпадения для S09 9X_perl-regex или E22, а 4 цифры года не являются обязательными, и 9X_regexp у вас есть фильмы длиннее 1 слова, с помощью 9X_perlre pcre вы можете использовать:

\b(Movie)\b\h+((?:(?!\h+[SE]\d+\b).)*)(?:\h(S\d+\h+E\d+))?
  • \b(Movie)\b Запечатлей слово Кино
  • ( Группа захвата
    • (?: Группа без захвата повторяется как целая часть
      • (?!\h+[SE]\d+\b). Соответствует любому символу, если часть S01 или E22 не находится прямо справа (где [SE] соответствует символу S или E, а \h соответствует горизонтальному пробелу)
    • )* Закройте группу без захвата и при необходимости повторите ее
  • ) Закрыть группу захвата
  • (?:\h(S\d+\h+E\d+)) Опционально захватить часть S01 E22 (где \d+ соответствует 1 или более цифрам)

Regex demo

Другой вариант 9X_regular-expressions с группой захвата для части S01 E22, либо 9X_apache-regexp совпадать с красным цветом строки

\b(Movie)\h+([^S\n]*(?:S(?!\d+\h+E\d+\b)[^S\n]*)*+)(S\d+\h+E\d+)?

Regex demo

10
0

Ответ #2

Ответ на вопрос: Regex: как опционально захватить группу

С вашими показанными образцами и попытками 9X_regexp попробуйте использовать регулярное выражение.

^Movie\s+\S+\s+(S\d{2}\s+E\d{2}(?=\s+\d{4}))

Вот 9X_regexes Online Demo для используемого регулярного выражения.

Объяснение: Добавлено 9X_regexes подробное объяснение используемого выше 9X_perl-regex регулярного выражения.

^Movie\s+\S+\s+  ##Matching string Movie from starting of value followed by spaces non-spaces and spaces.
(S\d{2}\s+E\d{2} ##Creating one and only capturing group where matching:
                 ##S followed by 2 digits followed by spaces followed by E and 2 digits.
  (?=\s+\d{4})   ##Making sure by positive lookahead that previous regex is followed by spaces and 4 digits.
)                ##Closing capturing group here.

8
0

Ответ #3

Ответ на вопрос: Regex: как опционально захватить группу

Идея сделать точку lazy .*? и заставить ее совпадать 9X_regexes с $ end, если часть other не существует.

Movie\s*(.*?)\s*(S\d\d\s*E\d\d|$)

See this demo at regex101 (далее я 9X_regexes добавил \s* пробелов вокруг захватов)

8
0

Ответ #4

Ответ на вопрос: Regex: как опционально захватить группу

В вашем регулярном выражении есть несколько 9X_regex ошибок:

  • Пробел после Movie не учитывается.
  • (.*) соответствует всему после Movie.

Попробуйте онлайн на https://regex101.com/

(Movie\s*)(\w*\s*)(S\d{2}\s*E\d{2}\s*)?((?:\w*\s*)*)

5
0