2013-10-09 5 views
0

Я хочу проанализировать все теги ссылок из html-файла. Поэтому для этого я написал следующее регулярное выражение, как показано ниже.Регулярный выпуск группы захвата выражения

var pattern = @"<(LINK).*?HREF=(""|')?(?<URL>.*?)(""|')?.*?>"; 
var regExOptions = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline; 

var linkRegEx = new Regex(pattern , regExOptions); 

foreach (Match match in linkRegEx.Matches(htmlFile)) 
{ 
    var group = match.Groups["URL"]; 
    var url = group.Value; 
} 

Но происходит то, что я нашел совпадения из html-файла, но я получаю пустую группу захвата.

+4

Почему бы не использовать подходящий html-парсер? – Jerry

+0

Потому что в html-парсере в качестве входных данных требуется весь html-файл. Но у меня нет полного файла. У меня есть только фрагмент данных этого файла. Поэтому я не могу это использовать. –

+0

Если ваш Html - xhtml, вы можете использовать XML-парсер .. это сработает для вас? – Mithon

ответ

1

Вы можете попробовать рисунок так:

var pattern = @"<(LINK).*?HREF=(?:([""'])(?<URL>.*?)\2|(?<URL>[^\s>]*)).*?>"; 

Это будет соответствовать:

  • буквальным <
  • буквальным LINK, захваченный в группе 1
  • ноль или более любой символ, не жадный
  • любое из следующих
    • один " или ', захваченный в группе 2
    • ноля или более любых символов, не жадность, захваченный в группе URL.
    • все было подобрано в группе 2 (\2 является обратной ссылки)
      или
    • ноль или более любых символов кроме символа пробела или >, жадно, захваченных в группе URL.
  • ноль или более любых символов, не жадностью
  • буквальным >

Это будет правильно обрабатывать входные сигналы, такие как:

  • <LINK HREF="Foo"> производит url = "Foo"
  • <LINK HREF='Bar'> производит url = "Bar"
  • <LINK HREF=Baz>url = "Baz"
+0

В этом шаблоне одна проблема заключается в том, что он не работает, когда атрибут HREF отсутствует в элементе. В то время он пытается проанализировать дальнейшие дочерние элементы. И это неправильно. –

+0

Я попытался создать дополнительный атрибут href, используя круглую скобку, как показано ниже. @ "<(LINK). *? (?: HREF = (?: ([" "']) (? . *?) \ 3 | (? [^ \ s>] *)))?. * ?> «Но в то время группа захвата URL возвращается пустым, даже если присутствует атрибут href. Должен ли я изменить backreference \ 3? –

+0

@RajdipPatel Можете ли вы опубликовать несколько примеров ввода и что вы хотите получить? –

Смежные вопросы