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

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 11 марта 2011
0 голосов
/ 11 марта 2011

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

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

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

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


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

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

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

0 голосов
/ 11 марта 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.
...