正则表达式,匹配任何东西或什么都不匹配?

3

我正在尝试创建一个用于嵌入YouTube视频的正则表达式。

目前,这是我拥有的基本工作内容:

http:\/\/www\.youtube\.com\/watch\?.*v=([a-z0-9-_]+)

它具有正常、可识别的YouTube URL,然后匹配唯一的视频代码。不幸的是,这对我的用户来说要求太高了。他们输入时缺少HTTP,缺少WWW,两者都缺少,有时他们将/watch?v=*替换为/v/*,在所有这些情况下都会破坏格式。

我想做的是允许在'youtube.com'之前和之后输入任何内容,以便无论输入如何,它都会接近完美。以下是示例。

http://www.youtube.com/watch?v=([a-z0-9-_]+) --- the normal, unmolested input
http://youtube.com/watch?v=([a-z0-9-_]+) --- missing WWW
www.youtube.com/watch?v=([a-z0-9-_]+) --- missing HTTP
youtube.com/watch?v=([a-z0-9-_]+) --- missing HTTP and WWW
http://www.youtube.com/v/([a-z0-9-_]+) --- substituted watch?v= for /v/
http://youtube.com/v/([a-z0-9-_]+) --- substituted watch?v= for /v/ AND missing WWW 
www.youtube.com/v/([a-z0-9-_]+) --- substituted watch?v= for /v/ AND missing HTTP
youtube.com/v/([a-z0-9-_]+) --- substituted watch?v= for /v/ AND missing HTTP and WWW

这是我认为应该有效(允许任何字符)的一种修改,但也许我漏掉了什么?

[.]+\youtube\.com\/[.]+([a-z0-9-_]+)

如果我表达含糊或者无知,那么我深感抱歉,我尝试了几种改变但都没有成功。或许我所寻找的是不可能的。我发誓尝试理解正则表达式,也许是时间的原因或者只是我自己,但我无法解释它。从我的角度来看,这是超越了秘密的。

真诚地感谢任何抽出一分钟时间的人...


2
正则表达式有许多种类,你使用的是哪一种?换句话说,你用什么来解析用户输入?PHP?Python?JavaScript?等等。 - matchew
3个回答

3
这应该就可以了……
(?:http://)?(?:www\.)?youtube\.com/(?:watch\?v=|v/)([\w-]+)
RegExr可以匹配URL,并将YouTube视频ID放入捕获组1中。它匹配可能的http://,然后可能的www.,然后总是youtube.com/,接着匹配watch?v=v/,最后匹配\w字符类和-。请注意保留原有的HTML标签。

0
在字符类中,.不是特殊字符,它字面上表示一个点。因此,[.]+ 表示 "一个或多个点"。我不知道你可能遇到的其他问题,但应该使用.+(或者可能是.*,因为 "youtube" 可能是字符串的开头)。

0

假设我有类似这样的东西

{e114dgfg084-4ddf1-21aea7}
以及像这样的东西:

{}

为了同时捕获它们:

{[0-9a-f\-]*}

另一个解决方案是

({}|{[a-zA-Z0-9\-]+})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接