import Foundation
let pattern = ##"^(?:(?: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*$"##
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
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
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let substitutionString = #"https://www.youtube.com/watch?v=XGkm-6yCIio"#
let result = regex.stringByReplacingMatches(in: testString, range: stringRange, withTemplate: substitutionString)
print(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 Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression