Мне нужна помощь с регулярным выражением, чтобы извлечь ссылку из строки в C #

Мне нужно извлечь ссылку из строки, используя регулярное выражение на C #. Я не могу использовать метод подстроки, так как буквы в строке и ссылке могут отличаться. Это ссылка с окружающими буквами:

-sv"><a href="http://sv.wikipedia.org/wiki/%C3%84pple" title="

Часть -sv"><a href=" должна быть включена в регулярное выражение, иначе она будет недостаточно конкретной. Конец регулярного выражения может быть в кавычках в конце ссылки или в зависимости от того, что будет проще всего. У меня было еще одно предложение, однако оно не включает в себя sv-часть в начале, и отправитель не мог его скомпилировать:

@"]*?HREF\s*=\s*[""']?([^'"" >]+?)[ '""]?[^>]*?>";

Теперь я обращаюсь к вам, ребята, по stackoverflow. Заранее спасибо! Максимум


person user655071    schedule 11.03.2011    source источник
comment
Не могли бы вы дать вашему вопросу больше контекста. Я подозреваю, что могут быть другие подходы к тому, что вы на самом деле пытаетесь достичь.   -  person Simen S    schedule 11.03.2011
comment
Я построил программу вокруг регулярного выражения, которое выбирает ссылку между sv ›‹ a href = и кавычкой после ссылки, мне просто нужно регулярное выражение, которое может это сделать. Могут быть и другие подходы, но я боюсь, что мне придется использовать решение с регулярными выражениями так, как выглядит моя программа.   -  person user655071    schedule 11.03.2011


Ответы (3)


Контрольный вопрос: Regex для анализа гиперссылок и описаний

person pirho    schedule 11.03.2011
comment
Извините, я новичок. Мне нужно, чтобы все было напечатано и готово к использованию, иначе я не знаю, что делать x) - person user655071; 11.03.2011

Парсить материал из html с помощью регулярного выражения чревато опасностью. См. этот классический ответ, который объясняет это с силой и юмором.

Проблема с вашим вопросом в том, что мы не знаем контекста.

  • Вы уверены, что одна и та же подстрока не появится дважды?
  • Вы уверены, что лишних пробелов не будет?
  • Вы уверены, что HTML-код будет действителен? (т.е. они могли забыть использовать "" или использовать вместо этого "")
  • Вы уверены, что они не поставят title перед href?

Есть много способов ошибиться ...


Однако, чтобы ответить на ваш вопрос, этот шаблон регулярного выражения будет работать для точной строки, которую вы вставили:

 -sv"><a href="([^"]+)"

Однако вы не сможете выполнить замену напрямую. Обратите внимание на (), это захват регулярного выражения. Я бы порекомендовал поискать это самостоятельно, так вы не будете вечно новичком :)

person Benjol    schedule 11.03.2011
comment
Я не могу уместить всю строку, так как это исходный код страницы википедии. Одна и та же подстрока никогда не появится дважды. Пробелов больше не будет. Это действительно будет. Нет, перед href нет заголовка. Строка является исходным кодом этой страницы: en.wikipedia.org/wiki/Apple - person user655071; 11.03.2011
comment
@user, ок. Однако мой ответ все еще в силе. Прости. - person Benjol; 11.03.2011
comment
ладно, я попробую вместо этого использовать парсер. Спасибо за помощь! - person user655071; 11.03.2011

Попробуйте использовать синтаксический анализатор HTML. Исходный код также очень интуитивно понятен для изучения.

Скачайте библиотеку, добавьте ссылку на HtmlAgilityPack.dll. Получите все свои ссылки с:

    List<string> listOfUrls = new List<string>();
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.Load(@"c:\ht.html");
        HtmlNodeCollection coll = doc.DocumentNode.SelectNodes("//li[@class='interwiki-sv']");
        foreach (HtmlNode li in coll)
        {
            if (li.ChildNodes.Count < 1) continue;
            HtmlNode node = li.ChildNodes.First();
            if (null == node) continue;
            HtmlAttribute att = node.Attributes["href"];
            if (null == att) continue;
            listOfUrls.Add(att.Value);
        }
    //Now, You got your listOfUrls to process.
person Typist    schedule 11.03.2011
comment
Как это установить? `Не могу найти никаких инструкций. Кроме того, уверены ли вы, что я могу использовать условия, начинающиеся с sv-, с этим инструментом? - person user655071; 11.03.2011
comment
@user: это библиотека, на которую вы можете ссылаться в своем коде. Вам нужно поиграть с ним в вашем случае, чтобы получить желаемый результат. - person Typist; 11.03.2011
comment
Есть идеи, как мне его использовать? Все, что я могу найти, это как обрабатывать файлы Html и как извлекать все ссылки с сайта. - person user655071; 11.03.2011