Я пытаюсь создать регулярное выражение, которое возвращает только теги <link> hrefs
Почему это регулярное выражение возвращает все hrefs, включая <a hrefs?
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+
<link rel = "stylesheet" rev = "stylesheet"
href = "idlecore-tidied.css?T_2_5_0_228" media = "screen">
<a href = "anotherurl">Slash Boxes</a>
Спасибо





/(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/
Я сам немного неуверен в обратных ссылках, поэтому я оставил это там. Это регулярное выражение:
/(<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/
... работает в моем тесте Javascript.
Какой аромат регулярного выражения вы используете? Perl, например, не поддерживает просмотр назад переменной длины. Если это возможно, я бы выбрал (отредактировано для реализации очень хорошей идеи от MizardX):
(?<=<link\b[^<>]*?)href\s*=\s*(['"])(?:(?!\1).)+\1
в первом приближении. Таким образом, выбор символа кавычки ('или ") будет совпадать. То же самое для языка без поддержки просмотра назад (переменной длины):
(?:<link\b[^<>]*?)(href\s*=\s*(['"])(?:(?!\2).)+\2)
\ 1 будет содержать ваш матч.
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+
работает с Экспрессо (я думаю, что Expresso работает на движке регулярных выражений .NET). Вы даже можете немного уточнить это, чтобы оно соответствовало закрывающему ' или
":
(?<=<link\s+.*?)href\s*=\s*([\'\"])[^\'\"]+(\1)
Возможно, ваш механизм регулярных выражений не работает с утверждениями просмотра назад. Обходной путь был бы
(?:<link\s+.*?)(href\s*=\s*([\'\"])[^\'\"]+(\2))
Тогда ваш матч будет в захваченной группе 1.
Либо
/(?<=<link\b[^<>]*?)\bhref=\s*=\s*(?:"[^"]*"|'[^']'|\S+)/
или же
/<link\b[^<>]*?\b(href=\s*=\s*(?:"[^"]*"|'[^']'|\S+))/
Основное отличие - [^<>]*? вместо .*?. Это потому, что вы не хотите, чтобы он продолжал поиск по другим тегам.
Превосходно! Я бы никогда не выбрал это!
Избегайте смотреть назад для такого простого случая, просто сопоставьте то, что вам нужно, и зафиксируйте то, что вы хотите получить.
Я получил хорошие результаты с <link\s+[^>]*(href\s*=\s*(['"]).*?\2) в The Regex Coach с опциями s и g.
Пожалуйста, перефразируйте вопрос. Не думаю, что кто-то поймет ваш вопрос в его нынешнем виде.