2015-04-03 3 views
0

Я пытаюсь понять, почему какое-то регулярное выражение не соответствует последнему буквенно-цифровому символу некоторого заданного текста, который может содержать или не содержать URL-адрес YouTube.Почему это регулярное выражение не соответствует последнему буквенно-цифровому символу?

Все регулярное выражение равно /(?:https|http):\/\/(?:www\.){0,1}(?:youtube\.com|youtu\.be)\/(?:watch\?v=){0,1}(\w+)[^\s]+/mig (оно соответствует URL-адресу youtube.com или youtu.be, пока не найдет пробел).

Вот фрагмент кода, который работает, как например, о моей проблеме (он показывает матч первого регулярного выражения, как 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>

Если выполнить так называемое регулярное выражение, оно 'll соответствует идентификатору видео YouTube, но ему не хватает последнего символа (он должен соответствовать 8C6xDjQ66wM, но он соответствует 8C6xDjQ66w).

+1

Ваше регулярное выражение может быть упрощено до 'HTTPS: \/\/(?: WWW \.)? youtu (?: be \ .com | \ .be) \/(?: watch \? v =)? (\ w +) \ S + ' – Oriol

+0

@Oriol Спасибо! Теперь, когда начинается безумство regexp! Я имею в виду, что другой пользователь может приехать сюда и повторно оптимизировать ваше собственное регулярное выражение, а другое снова ... hahaha Спасибо за предложение –

ответ

1

[^\s]+ требует, чтобы хотя бы один непространственный символ удовлетворял выражению, поэтому он принимает M. Похоже, вы могли бы сделать [^\s]* или, возможно, (?:[^\s]+|$) - все, что не требует хотя бы одного дополнительного символа.

+0

Спасибо за ваши усилия;) Вы правы! –

+0

Почему вы не редактируете свой ответ, и вы добавляете рабочий фрагмент, чтобы другие будущие посетители могли найти этот Q & A, чтобы узнать о возможном и рабочем URL-адресе YouTube, работающем в регулярном выражении? –

1

Все выражение может быть значительно улучшена

/^https?:\/\/(?:(?:www\.)?youtube\.com\/watch\?v=|youtu\.be)\/(\w+)$/ 
+1

Nice picture btw – MaxZoom

+0

@MaxZoom Gimme upvotes или я ем ваш мозг !!!!! –

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>

+0

Спасибо за усилие;) –

+0

Добро пожаловать :) –

Смежные вопросы