Regex and cron

Regex for YouTube URLs and Video IDs

Pull the video ID out of any YouTube link a user pastes, from watch pages to shorts and embeds.

  • Free foreverNo trial, no paywall, no usage limits.
  • No sign-upOpen the page and start. We never ask for an email to use a tool.
  • PrivateEverything runs in your browser. Your input is never uploaded or stored on our servers.
  • Works offlineOnce the page has loaded, the tool keeps working without a connection.

Pattern

/^(?:https?:\/\/)?(?:www\.|m\.|music\.)?(?:youtube\.com\/(?:watch\?(?:\S*?&)?v=|embed\/|shorts\/|live\/|v\/)|youtu\.be\/|youtube-nocookie\.com\/embed\/)(?<id>[A-Za-z0-9_-]{11})(?:[?&#]\S*)?$/

Regular expression

JavaScript syntax, run by your browser's own engine in a background worker. Press / anywhere to jump here.
Reset to the original pattern and examplesShow cheat sheet: click any token to insert itCopy pattern
Find every match instead of stopping at the first. Needed for matchAll() and for replacing all occurrences.Case-insensitive: /abc/i also matches "ABC" and "aBc".^ and $ match at the start and end of every line, not just the whole string. Use it to test one value per line.Lets . match line breaks too. Without it, . stops at \n and \r.Treats the pattern as Unicode code points: enables \p{…} property escapes and \u{…}, makes emoji count as one character, and rejects sloppy escapes.Only matches starting exactly at lastIndex (position 0 here), never further along. Useful for tokenizers that consume input piece by piece.Records the start and end index of every capture group (match.indices). The tester always shows group positions, so this only changes your code.The upgraded unicode mode (ES2024): set operations like [\p{L}--[a-z]] and [A&&B], string properties like \p{RGI_Emoji}. Cannot be combined with u.
8 matches8 matches · 1 group

Test string

Matches are highlighted as you type, in alternating colors. Click inside a match (or hover its row below) to color its capture groups.
8 matchesClear test string

Explanation

Every part of the pattern in plain English. Hover a row to highlight that part of the pattern.
Copy explanation

Loading the explainer…

Every match with its position and capture groups.Preview a replacement with $1, $<name> and $& references, then copy the result.Copy a ready-to-run snippet for JavaScript, Python, Go, C#, PHP or Dart.

Matches

Named groups are shown by name. undefined means the group did not take part in that match.
Copy matches as JSONDownload matches.csv
#MatchPositionGroups
1https://www.youtube.com/watch?v=dQw4w9WgXcQ0–43
  • iddQw4w9WgXcQ
2https://youtu.be/dQw4w9WgXcQ?t=4244–77
  • iddQw4w9WgXcQ
3https://www.youtube.com/watch?feature=share&v=dQw4w9WgXcQ78–135
  • iddQw4w9WgXcQ
4https://www.youtube.com/embed/dQw4w9WgXcQ?start=30136–186
  • iddQw4w9WgXcQ
5https://youtube.com/shorts/dQw4w9WgXcQ187–225
  • iddQw4w9WgXcQ
6https://m.youtube.com/watch?v=dQw4w9WgXcQ&list=PL123226–278
  • iddQw4w9WgXcQ
7https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ279–329
  • iddQw4w9WgXcQ
8youtu.be/dQw4w9WgXcQ330–350
  • iddQw4w9WgXcQ

Need a secure web app built around this? Talk to our team

Quick answer

This regex extracts the video ID from any common YouTube link: watch?v=, youtu.be/, /embed/, /shorts/, /live/ and youtube-nocookie.com embeds. The 11-character ID (letters, digits, hyphen and underscore) lands in the named group id, so match.groups.id gives you dQw4w9WgXcQ from https://youtu.be/dQw4w9WgXcQ?t=42. Extra parameters such as t= or list= are allowed after the ID.

  • Tested examples
  • Token-by-token breakdown
  • Code in 5 languages
  • Live tester

How to use the YouTube URL regex

  1. 1Copy the pattern with Copy pattern in the tester, or take a ready-made snippet for your language from the code section below.
  2. 2Check the sample lines in Test string: every line the YouTube URL regex accepts is highlighted, rejected lines stay plain.
  3. 3Paste your own values one per line to see which pass, and read Explanation for what each part of the pattern does.
  4. 4Open the Code tab for JavaScript, Python, Go, C#, PHP or Dart with the pattern translated and escaped.
  5. 5Validate again on the server: client-side checks give users quick feedback, not security.

How does the YouTube URL regex work?

Read it left to right. Each piece below matches one part of the input:

  • ^(?:https?:\/\/)? An optional http:// or https://, so pasted links without a scheme work too.
  • (?:www\.|m\.|music\.)? An optional www, mobile or YouTube Music subdomain.
  • youtube\.com\/(?:watch\?(?:\S*?&)?v=|embed\/|shorts\/|live\/|v\/) youtube.com followed by one of the page types. For watch pages, other parameters may come before v=.
  • |youtu\.be\/|youtube-nocookie\.com\/embed\/ Or the short youtu.be domain, or the privacy-enhanced embed domain.
  • (?<id>[A-Za-z0-9_-]{11}) The named group id: exactly 11 base64url characters.
  • (?:[?&#]\S*)?$ Optional extra parameters (t=, list=, si=) and the end of the string. This also proves the ID was exactly 11 characters.

Which strings does the YouTube URL regex match?

The whole input must match, from the first character to the last. Every row below is checked against the pattern by our automated test suite before each release.

InputMatches?Why
https://www.youtube.com/watch?v=dQw4w9WgXcQYesThe classic watch URL.
https://youtu.be/dQw4w9WgXcQ?t=42YesShort link with a timestamp.
https://www.youtube.com/watch?feature=share&v=dQw4w9WgXcQYesOther parameters before v=.
https://www.youtube.com/embed/dQw4w9WgXcQ?start=30YesEmbed URL from an iframe.
https://youtube.com/shorts/dQw4w9WgXcQYesA Short.
https://m.youtube.com/watch?v=dQw4w9WgXcQ&list=PL123YesMobile site with a playlist parameter.
https://www.youtube-nocookie.com/embed/dQw4w9WgXcQYesPrivacy-enhanced embed.
youtu.be/dQw4w9WgXcQYesNo scheme: pasted from a share sheet.
https://vimeo.com/123456789NoA different video site.
https://www.youtube.com/watch?v=shortNoVideo IDs are exactly 11 characters.
https://www.youtube.com/watch?v=dQw4w9WgXcQextraNoToo many characters for an ID.
https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOwNoA channel page, not a video.
https://notyoutube.com/watch?v=dQw4w9WgXcQNoLook-alike domains are rejected.

How do I get the video ID in code?

Read the named group from the match:

const YT = /^(?:https?:\/\/)?(?:www\.|m\.|music\.)?(?:youtube\.com\/(?:watch\?(?:\S*?&)?v=|embed\/|shorts\/|live\/|v\/)|youtu\.be\/|youtube-nocookie\.com\/embed\/)(?<id>[A-Za-z0-9_-]{11})(?:[?&#]\S*)?$/;

const id = YT.exec(input.trim())?.groups?.id ?? null;
const embed = id ? `https://www.youtube-nocookie.com/embed/${id}` : null;

Python names groups differently: the code below translates (?<id>…) to (?P<id>…) and you read it with match.group("id"). The 11-character ID format is an observed convention rather than a published guarantee, so if you need certainty, confirm the video with the YouTube Data API or the oEmbed endpoint.

Deliberately excluded, because none of them point at a single video:

  • channel pages (/channel/…, /@handle) and playlists without a video (/playlist?list=…),
  • search results and /results?search_query=…,
  • attribution links and Google redirect URLs that wrap a YouTube URL in a query parameter. Decode those first with the URL decoder, then run the pattern on the inner link.

Timestamps are kept outside the ID group, so you can read them separately from the query string with new URL(link).searchParams.get("t").

How do I use the YouTube URL regex in JavaScript, Python, Go, C# and PHP?

The pattern is translated for each engine rather than pasted as is: named groups, anchors, escapes, shorthand classes and flags are adjusted so each snippet behaves as closely to the JavaScript version as its engine allows. Differences that remain (Go's RE2 has no lookarounds or backreferences, for example) are called out under each one. The Code tab in the tester above also exports Dart, and updates as you edit the pattern.

JavaScript and TypeScript

const regex = /^(?:https?:\/\/)?(?:www\.|m\.|music\.)?(?:youtube\.com\/(?:watch\?(?:\S*?&)?v=|embed\/|shorts\/|live\/|v\/)|youtu\.be\/|youtube-nocookie\.com\/embed\/)(?<id>[A-Za-z0-9_-]{11})(?:[?&#]\S*)?$/;

function isValid(value) {
  return regex.test(value);
}

console.log(isValid("https://www.youtube.com/watch?v=dQw4w9WgXcQ"));

Python

import re

pattern = re.compile(r"^(?:https?:\/\/)?(?:www\.|m\.|music\.)?(?:youtube\.com\/(?:watch\?(?:\S*?&)?v=|embed\/|shorts\/|live\/|v\/)|youtu\.be\/|youtube-nocookie\.com\/embed\/)(?P<id>[A-Za-z0-9_\-]{11})(?:[?&#]\S*)?\Z")

def is_valid(value: str) -> bool:
    return pattern.search(value) is not None

print(is_valid("https://www.youtube.com/watch?v=dQw4w9WgXcQ"))
  • JavaScript's $ only matches at the very end of the string. Python's $ also matches before a trailing newline, so the pattern uses \Z instead.

Go

package main

import (
	"fmt"
	"regexp"
)

func main() {
	re := regexp.MustCompile(`^(?:https?:\/\/)?(?:www\.|m\.|music\.)?(?:youtube\.com\/(?:watch\?(?:\S*?&)?v=|embed\/|shorts\/|live\/|v\/)|youtu\.be\/|youtube-nocookie\.com\/embed\/)(?P<id>[A-Za-z0-9_\-]{11})(?:[?&#]\S*)?$`)
	fmt.Println(re.MatchString("https://www.youtube.com/watch?v=dQw4w9WgXcQ"))
}
  • Go's \s only matches space, \t, \n, \f and \r; JavaScript's also matches the non-breaking space and other Unicode spaces.

C#

using System;
using System.Text.RegularExpressions;

// The timeout stops a pathological input from hanging the thread (ReDoS).
var regex = new Regex(@"^(?:https?:\/\/)?(?:www\.|m\.|music\.)?(?:youtube\.com\/(?:watch\?(?:\S*?&)?v=|embed\/|shorts\/|live\/|v\/)|youtu\.be\/|youtube-nocookie\.com\/embed\/)(?<id>[A-Za-z0-9_\-]{11})(?:[?&#]\S*)?\z", RegexOptions.None, TimeSpan.FromSeconds(1));
Console.WriteLine(regex.IsMatch("https://www.youtube.com/watch?v=dQw4w9WgXcQ"));
  • JavaScript's $ only matches at the very end of the string. .NET's $ also matches before a trailing newline, so the pattern uses \z instead.

PHP

<?php

$pattern = '/^(?:https?:\/\/)?(?:www\.|m\.|music\.)?(?:youtube\.com\/(?:watch\?(?:\S*?&)?v=|embed\/|shorts\/|live\/|v\/)|youtu\.be\/|youtube-nocookie\.com\/embed\/)(?<id>[A-Za-z0-9_\-]{11})(?:[?&#]\S*)?$/D';

function isValid(string $value, string $pattern): bool
{
    return preg_match($pattern, $value) === 1;
}

var_dump(isValid('https://www.youtube.com/watch?v=dQw4w9WgXcQ', $pattern));
  • PCRE's \s matches ASCII whitespace unless Unicode properties (UCP) are on; JavaScript's also matches the non-breaking space and other Unicode spaces.
  • The D modifier makes $ match only at the very end, like JavaScript (PCRE's $ also matches before a trailing newline).

Browse all 25 patterns in the regex pattern library, or build your own in the regex tester.

Frequently asked questions

Eleven characters drawn from letters, digits, hyphen and underscore. The pattern requires exactly eleven, which is also what stops it from accepting a longer string that merely starts like an ID.
Yes. It accepts youtube.com/shorts/ID and youtube.com/live/ID as well as watch, embed, youtu.be and youtube-nocookie.com embed links.
Parse the link with the URL constructor and read the t or start parameter from searchParams. Keeping it out of the regex makes both the pattern and the timestamp handling simpler.

Last updated by the Playxoft engineering team.

From the engineers who built this tool

Building something bigger than a quick fix?

Auth, payments, dashboards and security are where web apps get hard. We have shipped them many times. Share your idea and we will map out a realistic plan and estimate, free and with no obligation.

More free tools

See all tools

Regex Tester

Test regex live with highlighted matches, plain-English explanations and code export.

Open tool

Cron Expression Generator

New

Build and explain cron schedules, see the next runs in any time zone, copy platform snippets.

Open tool

SQL Formatter

Beautify or minify SQL in 12 dialects, with keyword case, indent and line:column errors.

Open tool

cURL to Python Converter

New

Convert cURL commands into Python requests or httpx code with params, json, files and auth.

Open tool

cURL to Fetch Converter

New

Turn any cURL command into JavaScript fetch() code with headers, JSON, forms and auth.

Open tool

cURL to Axios Converter

New

Convert cURL commands into an Axios request config with params, data, auth and timeouts.

Open tool