Регулярное выражение в CS: извлечение данных - PullRequest
0 голосов
/ 20 марта 2012

У меня есть такие данные:

<td><a href="/New_York_City" title="New York City">New York</a></td>

И я бы хотел получить Нью-Йорк из него.

У меня нет никаких навыков в регулярных выражениях. Я пробовал это, хотя:

StreamReader sr = new StreamReader("c:\\USAcityfile2.txt");
string pattern = "<td>.*</td>";
Regex r = new Regex(pattern, RegexOptions.IgnoreCase);
Regex r1 = new Regex("<a .*>.*</a>", RegexOptions.IgnoreCase);
 string read = "";
while ((read = sr.ReadLine()) != null)
{
    foreach (Match m in r.Matches(read))
    {
        foreach (Match m1 in r1.Matches(m.Value.ToString()))
            Console.WriteLine(m1.Value);
    }
}
sr.Close();
sr.Dispose();

это дало мне <a href="/New_York_City" title="New York City">New York</a>.

Как добраться до данных между <a .*> и </a>? спасибо.

Ответы [ 6 ]

1 голос
/ 20 марта 2012

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

String pattern = @"(?<=<a[^>]*>).*?(?=</a>)

(?<=<a[^>]*>) - это положительное утверждение, подтверждающее, что перед желаемым шаблоном стоит <a[^>]*>.

(?=</a>) - это положительное прогнозное утверждение, гарантирующее, что * * * * * * * *> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1001* 1011 .*? * * * **

Хороший справочник по регулярным выражениям: регулярные-выражения.info

Их общее объяснение

0 голосов
/ 20 марта 2012

Используя HTML Agility Pack ( страница проекта , nuget ), это помогает:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes("a");
// or var nodes = doc.DocumentNode.SelectNodes("//td/a") ?? new HtmlNodeCollection();

foreach (var node in nodes)
{
    string city = node.InnerText;
}

// or var linkTexts = nodes.Select(node => node.InnerText);
0 голосов
/ 20 марта 2012

Согласно комментарию OP, этот входной документ является HTML, было бы лучше использовать анализатор HTML, например: Html Agility Pack .Вы можете использовать XPath //td/a для получения желаемого результата.

0 голосов
/ 20 марта 2012
var g = Regex.Match(s, @"\<a[^>]+\>([^<]*)").Groups[1];

Чтобы найти все значения <a> в вашем файле, вы можете использовать следующий (более простой) код:

        var allValuesOfAnchorTag =
            from line in File.ReadLines(filename)
            from match in Regex.Matches(line, @"\<a[^>]+\>([^<]*)").OfType<Match>()
            let @group = match.Groups[1]
            where @group.Success
            select @group.Value;

Однако вы, похоже, работаете с XML, как правильно указал @ kirill-polishchukиз.Если это правда, код еще проще:

        var values = from e in XElement.Load(filename).Descendants("a")
                         select e.Value;
0 голосов
/ 20 марта 2012
           foreach (Match m1 in r1.Matches(m.Value.ToString()))
                {
                    //Console.WriteLine(m1.Value);
                    string[] res = m1.Value.Split(new char[] {'>','<'});
                    Console.WriteLine(res[2]);
                }

Сделал трюк, для этого конкретного примера.Все еще не то, что я ищу.

0 голосов
/ 20 марта 2012

Только один Regex будет делать:

string pattern = "<a[^>]*>(.*)</a>";
...