Регулярное выражение
От: skodnik  
Дата: 08.12.10 10:39
Оценка:
Есть текст:

<item id="1">
...... <span class="meta-categories">in
<a href="/category/1">Cat1</a> \ <a href="/category/1/2">Cat12</a> \ <a href="/category/1/2/1">Cat121</a>
</span> ......
</item>

<item id="2">
......<span class="meta-categories">in
<a href="/category/1">Cat1</a> \ <a href="/category/1/2">Cat12</a> \ <a href="/category/1/2/1">Cat121</a>
</span> ......
</item>
и т.д.

Мне необходимо распарсить все item'ы в рамках каждого item'а получить массив значений типа:
"/category/1", "Cat1"
"/category/1/2", "Cat12"
"/category/1/2/1", "Cat121"
как ?
Допустим есть некое РВ, которое парсит айтемы:

<item id="\d+">.*?<span class="meta-categories">(?<here>.*?)</span>.*?</item>


каждый матч будет иметь строку ["here"] — а вот как в ней поступить (чтобы за раз получить массив значений) незнаю
В крайнем случае, мне подойдет последнее значение "/category/1/2/1", "Cat121", но и этого добиться не могу.
Re: Регулярное выражение
От: Lloyd Россия  
Дата: 08.12.10 10:52
Оценка: 1 (1) +1
Здравствуйте, skodnik, Вы писали:

S>как ?

S>Допустим есть некое РВ, которое парсит айтемы:

Забудь о регулярных выражениях. Лучше по-честному распарсить html, взяв SGMLReader (ищется гуглом).
Re[2]: Регулярное выражение
От: skodnik  
Дата: 08.12.10 10:56
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, skodnik, Вы писали:


S>>как ?

S>>Допустим есть некое РВ, которое парсит айтемы:

L>Забудь о регулярных выражениях. Лучше по-честному распарсить html, взяв SGMLReader (ищется гуглом).

Спасибо! Займусь.
Но по регулярке вопрос остается хотябы из академического интереса. Я всегда на вот таких "подмачах" останавливался.
Re: Регулярное выражение
От: skodnik  
Дата: 09.12.10 08:12
Оценка:
Куда подевался Пельмешко?
Он бы точно помог
Re[3]: Регулярное выражение
От: hardcase Пират http://nemerle.org
Дата: 09.12.10 08:17
Оценка: +1
Здравствуйте, skodnik, Вы писали:

S>Но по регулярке вопрос остается хотябы из академического интереса. Я всегда на вот таких "подмачах" останавливался.


Мне казалось, это уже знатный боян — разбор HTML с помощью регулярок...
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Регулярное выражение
От: Пельмешко Россия blog
Дата: 09.12.10 09:42
Оценка: 2 (1)
Здравствуйте, skodnik, Вы писали:

S>Куда подевался Пельмешко?

S>Он бы точно помог

У Пельмешки угнали ноут, не посидишь ночами теперь на rsdn
Когда я вижу регвыры over html/xml, то начинаю громко ругаться матом, юзайте SGMLReader!!!

А насчёт академического интереса:
using System;
using System.Linq;
using System.Text.RegularExpressions;

class Foo
{
    const string Input = @"
<item id=""1"">
..<span class=""meta-categories"">in
    <a href=""/category/1"">Cat1</a> \
    <a href=""/category/1/2"">Cat12</a> \
    <a href=""/category/1/2/1"">Cat121</a>
  </span> ......
</item>

<item id=""2"">
..<span class=""meta-categories"">in
    <a href=""/category/1"">Cat1</a> \
    <a href=""/category/1/2"">Cat12</a> \
    <a href=""/category/1/2/1"">Cat121</a>
  </span> ......
</item>";

    const string Pattern = @"
<item\s+id=""(?<id>\d+)"">.*?
  <span[ ]class=""meta-categories"">.*?
    (<a[ ]href=""(?<href>[^""]+)"">
      (?<name>[^<]+)
    </a>.*?)*
  </span>
.*?</item>";

    const RegexOptions Options =
        RegexOptions.IgnorePatternWhitespace |
        RegexOptions.Singleline;

    static void Main()
    {
        var results = Regex
            .Matches(Input, Pattern, Options).Cast<Match>()
            .SelectMany(m => Enumerable.Zip(
                m.Groups["href"].Captures.Cast<Capture>(),
                m.Groups["name"].Captures.Cast<Capture>(), Tuple.Create));

        foreach (var r in results) Console.WriteLine(r);
    }
}

Любую capturable-группу можно повторить квантификаторами, но тогда через Group.Value будет возвращаться только последнее совпадение данной группы. Однако дотнетное API позволяет посмотреть предыдущие совпадения группы через коллекцию Captures.

p.s.
Re[4]: Регулярное выражение
От: stele Россия www.stele.su
Дата: 09.12.10 10:16
Оценка: 2 (1)
Здравствуйте, hardcase, Вы писали:

H>Мне казалось, это уже знатный боян — разбор HTML с помощью регулярок...


Умом смысл этой затеи не понять, это надо сердцем прочувствовать.
Автор: stele
Дата: 22.09.09
... << My edition based on RSDN@Home 1.2.0 alpha 4 rev. 1476 >>
В задаче спрашивается:
Сколько вытечет портвейна из открытого бассейна?
Re[3]: Регулярное выражение
От: skodnik  
Дата: 09.12.10 13:30
Оценка:
Здравствуйте, Пельмешко, Вы писали:
П>У Пельмешки угнали ноут, не посидишь ночами теперь на rsdn
П>Когда я вижу регвыры over html/xml, то начинаю громко ругаться матом, юзайте SGMLReader!!!

Дохнет он на тех HTML'ях
Re[4]: Регулярное выражение
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.12.10 13:45
Оценка:
Здравствуйте, skodnik, Вы писали:

S>Дохнет он на тех HTML'ях


Есть еще htmlagilitypack.codeplex.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.