Это выражение:
/youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
соответствует первому регулярному выражению, поскольку объект регулярного выражения истинен в логическом контексте, поэтому это:
:with => /youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
эквивалентно следующему:
:with => /youtu\.be\/([^\?]*)/
Это выражение:
/youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
соответствует второму регулярному выражению, поэтому это:
:with => /youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
эквивалентно этому:
:with => /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
Я думаю, вы просто хотите объединить два регулярных выражения в одно с оператором чередования:
:with => /youtu\.be\/([^\?]*)|^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
#----------------------------^
Вы можете также рассмотреть возможность пропустить валидатор регулярного выражения в пользу или простой метод Ruby, который использует URI.parse
чтобы разделить URL, тогда вы можете проверить параметры имени хоста, пути и CGI по отдельности, не пытаясь вставить все это в регулярное выражение.