re = /^(?:(?:https?:)?\/\/)?(?:(?:(?:www|m(?:usic)?)\.)?youtu(?:\.be|be\.com)\/(?:shorts\/|live\/|v\/|e(?:mbed)?\/|watch(?:\/|\?(?:\S+=\S+&)*v=)|oembed\?url=https?%3A\/\/(?:www|m(?:usic)?)\.youtube\.com\/watch\?(?:\S+=\S+&)*v%3D|attribution_link\?(?:\S+=\S+&)*u=(?:\/|%2F)watch(?:\?|%3F)v(?:=|%3D))?|www\.youtube-nocookie\.com\/embed\/)([\w-]{11})[\?&#]?\S*$/m
str = ' various protocols (and lack of one):
https://www.youtube.com/watch?v=U9t-slLl30E
http://www.youtube.com/watch?v=U9t-slLl30E
//www.youtube.com/watch?v=U9t-slLl30E
www.youtube.com/watch?v=U9t-slLl30E
and for each protocol
various domains:
www.youtube.com/watch?v=U9t-slLl30E
m.youtube.com/watch?v=U9t-slLl30E
music.youtube.com/watch?v=OD3F7J2PeYU
youtube.com/watch?v=U9t-slLl30E
www.youtube-nocookie.com/embed/U9t-slLl30E
youtu.be/U9t-slLl30E
and for each domain (despite -nocookie)
various paths:
youtube.com/watch?v=U9t-slLl30E
youtube.com/watch/U9t-slLl30E
youtube.com/v/U9t-slLl30E
youtube.com/embed/U9t-slLl30E
youtube.com/e/U9t-slLl30E
youtube.com/live/9UMxZofMNbA
youtube.com/shorts/gOcxEMJSksg
youtube.com/oembed?url=http%3A//www.youtube.com/watch?v%3DU9t-slLl30E&format=json
youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DU9t-slLl30E%26feature%3Dshare
youtube.com/attribution_link?a=8g8kPrPIi-ecwIsS&u=/watch%3Fv%3DU9t-slLl30E%26feature%3Dem-uploademail
and for each path
various parameters:
youtube.com/watch?v=U9t-slLl30E
youtube.com/watch?v=U9t-slLl30E&feature=shared
youtube.com/watch?v=U9t-slLl30E&t=1m02s
youtube.com/watch?v=U9t-slLl30E&lc=UgyYsn3aIQWSA19Esi54AaABAg
youtube.com/watch?v=Lo2qQmj0_h4&list=PLmXxqSJJq-yVWpRFGImHYZBQTuBGLjG4t&index=5&pp=iAQB8AUB
in various order:
youtube.com/watch?feature=shared&v=U9t-slLl30E
but not these:
(wrong ID)
youtube.com/watch?v=U$t-slLl30E
(too short ID)
youtube.com/watch?v=U9t-slLl30&t=10
(wrong or deprecated paths)
youtube.com/GitHub?v=U9t-slLl30E
youtube.com/?v=U9t-slLl30E
youtube.com/?vi=U9t-slLl30E
youtube.com/?feature=player_embedded&v=U9t-slLl30E
youtube.com/watch?vi=U9t-slLl30E
youtube.com/vi/U9t-slLl30E
(www.youtube-nocookie.com/embed/ only!)
youtube-nocookie.com/embed/U9t-slLl30E
www.youtube-nocookie.com/watch?v=U9t-slLl30E
http://www.youtube-nocookie.com/v/U9t-slLl30E?version=3&hl=en_US&rel=0
(playlist)
youtube.com/playlist?list=PLmXxqSJJq-yVWpRFGImHYZBQTuBGLjG4t'
subst = 'https://www.youtube.com/watch?v=XGkm-6yCIio'
result = str.gsub(re, subst)
# Print the result of the substitution
puts result
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html