2017-02-17 5 views
2

У меня есть следующие C# RegexНе совпадают адреса YouTube с начала двойные кавычки - C# Regex

@"(?:https?:\/\/)?(?:www\.)?(?:(?:(?:youtube\.com\/watch\?[^?]*v=|youtu\.be\/)))([\w-]+)"; 

Как я могу это исправить, так что регулярное выражение не будет соответствовать URL-адреса с кавычками в начале URL , поэтому, если URL-адрес находится в атрибуте href в гиперссылке, он будет проигнорирован и не будет записан.

Я использовал это выражение в своем другом шаблоне Regex Twitter, но я не могу заставить его работать в этом.

(?<!"") 

Он работал по образцу Twitter:

(?<!"")https?://twitter\.com/(?:#!/)?(\w+)/status(?:es)?/(\d+) 

Так YouTube Regex должен захватить только URL-адрес, которые не являются двойными кавычками в начале URL.

+1

См. [Это демо] (http://regexstorm.net/tester?p=%28%3f%3c!%22%5b%5e%22%3c%3e%5d*%29%28%3f% 3ahttps% 3f% 3a% 5c% 2f% 5c% 2f% 29% 3f% 28% 3f% 3awww% 5с.% 29% 3f% 28% 3f% 3a% 28% 3f% 3a% 28% 3f% 3ayoutube% 5с .com% 5c% 2fwatch% 5c% 3f% 5b% 5e% 3f% 5d * v% 3d% 7cyoutu% 5c.be% 5c% 2f% 29% 29% 29% 28% 5b% 5cw-% 5d% 2b% 29 & я =% 3c + HREF% 3d% 22http% 3a% 2f% 2fwww.youtube.com% 2fwatch% 3fv% 3dddd + HTTP% 3a% 2f% 2fwww.youtube.com% 2fwatch% 3fv% 3dddd% 22% 3e + HTTP % 3a% 2f% 2fwww.youtube.com% 2fwatch% 3fv% 3dddd). –

+2

Используйте html-парсер для извлечения текстовых узлов раньше, таким образом вы избегаете всех атрибутов html. (и если вы используете запрос XPath, вы даже можете выбрать только текстовые узлы, содержащие строку «youtu») –

+1

Собственно, если вам просто нужно * извлечь * ссылки из * обычного текста *, вам лучше сделать это с помощью HtmlAgilityPack : 'public string getCleanHtml (строка html) { var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml (html); return HtmlAgilityPack.HtmlEntity.DeEntitize (doc.DocumentNode.InnerText); } ' –

ответ

0

Чтобы ответить на вопрос: (?<!") будет провалить матч, если нет "непосредственно перед текущего местоположения. Если не должно быть ", за которым следует 0+ других символов перед текущим местоположением, вы можете использовать .NET infin-width lookbehind.

В этом случае, вы можете превратить ваш loobehind в

(?<!"[^"<>]*) 

См regex demo. Обратите внимание, что [^"<>]* соответствует 0+ символам, отличным от ", < и >, поэтому " будет проверяться только в том случае, если внутри узла элемента , если HTML отлично сериализуется. Если он содержит равные < или > значения внутренних атрибутов, этот подход не будет работать.

Вот почему вы должны подумать об использовании соответствующего анализатора HTML для этой задачи, так как вы используете его уже в проекте. Если вы сообщите, чего вы пытаетесь достичь, я обновлю ответ.