为什么这个正则表达式与最后的字母数字字符不匹配?

时间:2015-04-03 19:10:45

标签: javascript regex

我正在试图弄清楚为什么某些正则表达式与某些给定文字的最后一个字母数字字符不匹配,这些字符可能包含 YouTube 网址。

整个正则表达式为/(?:https|http):\/\/(?:www\.){0,1}(?:youtube\.com|youtu\.be)\/(?:watch\?v=){0,1}(\w+)[^\s]+/mig(它与youtube.com或youtu.be URL匹配,直到找到空格为止。)

这是一个代码片段,作为我的问题的示例(它将第一个正则表达式的匹配显示为JSON):

var match = /(?:https|http):\/\/(?:www\.){0,1}(?:youtube\.com|youtu\.be)\/(?:watch\?v=){0,1}(\w+)[^\s]+/mig.exec("https://www.youtube.com/watch?v=8C6xDjQ66wM");

document.getElementById("result").textContent = JSON.stringify(match);
<div id="result"></div>

如果您执行所谓的正则表达式,它将匹配YouTube视频ID,但它缺少最后一个字符(它应与8C6xDjQ66wM匹配,但它与8C6xDjQ66w匹配。

2 个答案:

答案 0 :(得分:1)

[^\s]+需要至少一个非空格字符来满足表达式,因此它需要M。好像你可以做[^\s]*(?:[^\s]+|$) - 任何不需要至少一个额外角色的东西。

答案 1 :(得分:1)

如果你坚持自己的正则表达式,这里有一个固定版本,其中包含进入捕获组的URL的最后一个字母(刚刚移动[^\s]+(\w+[^\s]+)):

var match = /(?:https|http):\/\/(?:www\.){0,1}(?:youtube\.com|youtu\.be)\/(?:watch\?v=){0,1}(\w+[^\s]+)/mig.exec("https://www.youtube.com/watch?v=8C6xDjQ66wM");
document.getElementById("result").textContent = JSON.stringify(match);

    
<div id="result"></div>

相关问题