无效的正则表达式-无需重复-Javascript

无效的正则表达式-无需重复-Javascript,javascript,Javascript,我正试图用正则表达式从输入的youtube url获取视频ID 下面是我正在使用的正则表达式: /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/ 但它又回来了 未捕获的语法错误:无效的正则表达式:/^.*(youtu.be/|v/| u/w/| embed/| watch?v=|&v=|?v=)([^#和?]*)./:无需重复 为什么? 下面是我的代码: function Preview

我正试图用正则表达式从输入的youtube url获取视频ID

下面是我正在使用的正则表达式:

/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/
但它又回来了

未捕获的语法错误:无效的正则表达式:
/^.*(youtu.be/|v/| u/w/| embed/| watch?v=|&v=|?v=)([^#和?]*)./
:无需重复

为什么?

下面是我的代码:

function PreviewVideo() {
var self = this;
this.links = $(".videoPreview");

this.bindEvents = function () {
    self.links.on("click", self.fireModal);
};
this.getYoutubeId = function (url) {

    var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
    var match = url.match(regExp);
    if (match && match[2].length == 11) {
        return match[2];
    } else {
        return false;
    }
};
this.fireModal = function (e) {
    e.preventDefault;
    var $this = $(this);
    var videoField = $this.data("video");
    var videoURL = $(videoField).val();

    if (videoURL === "") {
        $("body").append(UI.toast({level: "danger", time: 5000, html: "<h4>No video URL found</h4>", dismissable: true, position: "top-right"}));
    } else {
        var videoID = self.getYoutubeId(videoURL);
        if (videoID) {
            UI.modal({title: "Video preview", body: '<iframe width="560" height="315" src="//www.youtube.com/embed/' + videoID + '" frameborder="0" allowfullscreen></iframe>'})
        } else {
            $("body").append(UI.toast({level: "danger", time: 5000, html: "<h4>Invalid URL</h4>", dismissable: true, position: "top-right"}));
        }
    }
};

this.bindEvents();
函数预览视频(){
var self=这个;
this.links=$(“.videoPreview”);
this.bindEvents=函数(){
self.links.on(“单击”,self.fireModal);
};
this.getYoutubeId=函数(url){
变量regExp=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|v=&v=|v=)([^#;
var match=url.match(regExp);
if(match&&match[2]。长度==11){
返回匹配[2];
}否则{
返回false;
}
};
this.fireModal=函数(e){
e、 防止违约;
var$this=$(this);
var videoField=$this.data(“视频”);
var videoURL=$(videoField.val();
如果(视频URL==“”){
$(“body”).append(UI.toast({level:“danger”,time:5000,html:“找不到视频URL”,dismissable:true,position:“右上方”}));
}否则{
var videoID=self.getYoutubeId(videoURL);
如果(视频ID){
模态({标题:“视频预览”,正文:'})
}否则{
$(“body”).append(UI.toast({level:“danger”,time:5000,html:“Invalid URL”,dismissable:true,position:“top right”}));
}
}
};
这是bindEvents();

}

从错误消息中可以看出,由代码生成的正则表达式无效:

//^.*(youtu.be/|v/|u/w/|embed/|watch?v=|&v=|?v=)([^#&?]*).*//
原因是您将整个正则表达式文字放在一个字符串中:

var regExp = "/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^‌​#\&\?]*).*/";
这无法工作,部分原因是
\
也是字符串文本中的转义章程,因此当您编写
&v=\?v=
时,传递给正则表达式引擎的是
&v=\?v=
(并且
\?
无效)

只需使用regex文本:

var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^‌​#\&\?]*).*/;

youtube.be之后的
/
被认为是正则表达式的结尾。你必须转义它。@FabianKlötzl:它被转义了,代码没有正确标记。欢迎来到堆栈溢出!请看一看,通读,特别是请展示创建正则表达式的实际代码。由于您在发布问题时没有使用正确的格式,我们无法确定上述内容是否确实是您正在使用的内容。错误消息中的表达式与您发布的表达式不同。你确定你在用那个吗?字符串文字中包含的表达式有可能吗?看起来您正在做
新的RegExp('/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=&v=|v=)([^和\?]*)
(错误消息中的双斜线和缺少的转义字符是一个强有力的指示器)。那不行。您应该使用正则表达式文字来代替:
/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|v=)([^和\?]*)/
。重新格式化:当您提出问题时,文本区域右侧有一个大橙色的“如何格式化”框,其中包含有用的信息、整个格式化辅助工具工具栏、一个[?]提供格式帮助的按钮,以及位于文本区域和“发布您的问题”按钮之间的预览区域(这样您就必须滚动过去才能找到按钮,以鼓励您查看),显示您的帖子在发布时的外观。把你的帖子说清楚,并证明你花了时间这样做,提高了你得到好答案的机会。更改了我的问题我将整个函数复制到浏览器的控制台中,没有出现语法错误。与正则表达式相关的代码很好。