Это выражение
https?:\/\/(?:www\.)?(youtu(\.?be)?(\.com)?)\/(?:embed\/)?(?:watch\?(?:feature=player_embedded&)?v=)?([A-Za-z0-9_-]{11})
, кажется, передает желаемые данные, и я предполагаю, что вы можете извлечь те идентификаторы, которые захватываются с помощью этой группы захвата,
([A-Za-z0-9_-]{11})
и вы можете проверить, все ли необходимые символы уже включены в этот класс символов:
[A-Za-z0-9_-]
и, если не просто, добавьте их.
Выражение дополнительно объяснено в верхней правой части этой демонстрации , если вы хотите изучить его дальше или изменить его, а в этой ссылке вы можете посмотреть, как оно будет сопоставьте с некоторыми примерами входных данных, если хотите.
Или, если мы хотим захватить различные компоненты URL, мы бы включили в наше выражение больше групп захвата, а не групп захвата:
^https?:\/\/(www\.)?((music\.)?youtu(\.?be)?(\.com)?)\/(embed\/)?(watch\?(feature=player_embedded&(?:amp;)*?)?v=)?(get_video_info\?el=embedded&hl=en&ps=default&video_id=)?([A-Za-z0-9_-]{11})(.*)$
и наши желаемые идентификаторы находятся в группе захвата $10
в этом длинном выражении, которое на самом деле не так сложно спроектировать.
Как создать выражение для всех URL-адресов?
Мы просто перечислим все возможные URL-адреса, затем сначала захватили бы 11-значные идентификаторы и добавили бы необязательные группы ?
для различных компонентов URL-адресов слева от идентификаторов, и все.
Экранирование
Похоже, что для экранирования метачаров мы бы удваивали обратную косую черту, \\
вместо \
, например, наш шаблон может выглядеть примерно так:
^https?:\\/\\/(www\\.)?((music\\.)?youtu(\\.?be)?(\\.com)?)\\/(embed\\/)?(watch\\?(feature=player_embedded&(?:amp;)*?)?v=)?(get_video_info\\?el=embedded&hl=en&ps=default&video_id=)?([A-Za-z0-9_-]{11})(.*)$
Вы можете дополнительно проверить эту демонстрацию , чтобы увидеть, как изменится экранирование в примере, который вы предоставили в комментарии.
RegEx Circuit
jex.im визуализирует регулярные выражения:
Ссылка
Формат регулярного выражения Swift?
NSRegularExpression