Ваше регулярное выражение:
#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#
сводится к трем альтернативным частям:
(?<=v=)[a-zA-Z0-9-]+(?=&)
(?<=[0-9]/)[^&\n]+
(?<=v=)[^&\n]+
(?<=...)
называется утверждением-зазором, и в двух из этих частей вы видите, что оно выглядитдля v=
.
В первом варианте он ищет [a-zA-Z0-9-]+
, за которым следует &
.(что является предварительным утверждением: (?=...)
)
Вторая альтернатива в данном случае не применима.
В третьей альтернативе она ищет что-либо до тех пор, пока не нажмет &
или \n
.
Ваш пример не подходит ни к одному из них.Самым простым решением было бы изменить последнюю часть:
(?<=v=)[^&\n]+
на
(?<=v=)[^&\s]+
, чтобы оно прекратило сопоставление на &
или любом пустом месте (\s
).
Или лучший совет: просто перепишите все это, чтобы действительно разобрать URL обычным способом, сохраняя некоторые головные боли в будущем.