Что такое REGEX, чтобы соответствовать этому шаблону в HTML-документе в C #? - PullRequest
0 голосов
/ 27 мая 2009

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

В определенных документах HTML отображается следующее:

<span id="label">
<span>
<a href="http://variableLink">Joe Bloggs</a>
now using
</span>
<span>
'
<a href="/variableLink/">Important Data</a>
'
</span>
<span>
on
<a href="/variableLink">Important data 2</a>
</span>
</span>

Мне нужно извлечь две точки «важных данных», и я мог бы потратить часы на разработку регулярного выражения для этого (я использую библиотеку регулярных выражений .net в C # 3.5)

Ответы [ 5 ]

4 голосов
/ 27 мая 2009

Ниже используется HtmlAgilityPack . Он печатает любой текст внутри второй или более поздней ссылки внутри идентификатора «label». Конечно, относительно просто изменить XPath, чтобы сделать что-то немного другое.

    HtmlDocument doc = new HtmlDocument();
    doc.Load(new StringReader(@"<span id=""label"">
<span>
<a href=""http://variableLink"">Joe Bloggs</a>
now using
</span>
<span>
'
<a href=""/variableLink/"">Important Data</a>
'
</span>
<span>
on
<a href=""/variableLink"">Important data 2</a>
</span>
</span>
"));
    HtmlNode root = doc.DocumentNode;

    HtmlNodeCollection anchors;
    anchors = root.SelectNodes("//span[@id='label']/span[position()>=2]/a/text()");
    IList<string> importantStrings;
    if(anchors != null)
    {
        importantStrings = new List<string>(anchors.Count);
        foreach(HtmlNode anchor in anchors)
        importantStrings.Add(((HtmlTextNode)anchor).Text);
    }
    else
        importantStrings = new List<string>(0);

    foreach(string s in importantStrings)
        Console.WriteLine(s);
4 голосов
/ 27 мая 2009

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

<a href="[^"]*">(?<data>[^<]*)</a>

Это выражение будет соответствовать всем ссылкам, не начинающимся с http:// - это единственное очевидное различие, которое я вижу между ссылками.

<a href="(?!http://)[^"]*">(?<data>[^<]*)</a>
0 голосов
/ 27 мая 2009
  <a\shref.*?"/variableLink/?">(.*)</a>

Первая группа содержит Имя якорей. Протестировано с Expresso. Работает с предоставленным вами образцом текста.
Обновление : работает и со Snippy.

Regex regex = new Regex(@"<a\shref.*?""/variableLink/?"">(.*)</a>", RegexOptions.Multiline);
foreach (Match everyMatch in regex.Matches(sText))
{
  Console.WriteLine("{0}", everyMatch.Groups[1]);
}

Выходы:

Important Data
Important data 2
0 голосов
/ 27 мая 2009

Мой Regex немного ржавый, но что-то вроде следующего может помочь (хотя, возможно, потребуется некоторая доработка):

(?<=\<a href="/variableLink[/]?"\>)(.*)+(?=</a>)
0 голосов
/ 27 мая 2009

Найдите синтаксис упреждения и упреждения для .NET и используйте его для поиска тегов привязки в HTML. Этот сайт может вам помочь. В качестве альтернативы регулярным выражениям вы можете рассмотреть возможность использования System.Xml.XPath.XPathNavigator для непосредственного обращения к этим узлам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...