Как подсказка, строки, которые вы хотите сопоставить, всегда имеют длину 11 символов.Вместо того, чтобы пытаться сопоставить «как можно больше символов» с помощью квантификатора +
, вместо этого сопоставьте «ровно 11 символов» с помощью квантификатора {11}
.
Это может вылечить симптомы о проблеме чрезмерного соответствия, которую вы видите, хотя я не знаю, почему она в первую очередь соответствует этим строкам.(Они не начинаются с v=
.)
Вы, вероятно, должны уточнить свои чередования |
, заключив в скобки:
((?<=v=)[a-zA-Z0-9-_]+(?=&))|((?<=[0-9]/)[^&\n]+)|((?<=v=)[^&\n]+)
, и если ваш вариант регулярного выражения поддерживает подробные регулярные выражения (комментариивнутри регулярных выражений) используйте их!
В качестве предложения - парсинг URL с помощью регулярных выражений является неприятным.Вместо этого я бы:
- получил бы список всех URL-адресов на странице, используя анализатор HTML (в Python я использовал бы
BeautifulSoup
, что позволяет очень легко получить «все ссылки».) - Разбор каждого URL с использованием
parse_url()
(больше Python), получение словаря / хэша атрибутов GET.Пример:
Словарь может выглядеть так:
{
'v' : '_ClmClS_Mqs',
'list' : 'PL6422619E56951B73',
'index' : '5'
'feature' : 'plpp_video',
}
Тогда вы можете просто запросить атрибут GET v
.Регулярные выражения не требуются.
Это специфично для Python, но Java будет иметь эквиваленты.Дело в том, что регулярное выражение не всегда является лучшим инструментом (просто наиболее общим инструментом.)