0

次のようなデータがあります。

<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>ますか? ありがとう。

4

6 に答える 6

1

この特定のケースで正規表現を主張する場合は、これを試してください。

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

(?<=<a[^>]*>)<a[^>]*>必要なパターンの前にあることを確認する肯定的な後読みアサーションです。

(?=</a>)</a>パターンの後にあることを確認するための肯定的な先読みアサーションです。

.*?遅延量指定子であり、最初の一致まで可能な限り少なく一致します</a>

正規表現の良いリファレンスは、regular-expressions.info です。

彼らのルックアラウンドの説明

于 2012-03-20T06:58:59.277 に答える
0
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;

ただし、@ kirill-polishchukが正しく指摘しているように、XMLを使用しているようです。それが本当なら、コードはさらに単純です。

        var values = from e in XElement.Load(filename).Descendants("a")
                         select e.Value;
于 2012-03-20T06:56:22.180 に答える
0

HTML Agility Pack ( project pagenuget )を使用すると、次のようになります。

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);
于 2012-03-20T10:59:35.073 に答える
0

OP コメントによると、その入力ドキュメントは HTML です。HTML パーサーを使用することをお勧めします (例: Html Agility Pack ) 。XPath//td/aを使用して、目的の結果を得ることができます。

于 2012-03-20T08:32:03.887 に答える
0

正規表現は 1 つだけです。

string pattern = "<a[^>]*>(.*)</a>";
于 2012-03-20T06:32:17.370 に答える
0
           foreach (Match m1 in r1.Matches(m.Value.ToString()))
                {
                    //Console.WriteLine(m1.Value);
                    string[] res = m1.Value.Split(new char[] {'>','<'});
                    Console.WriteLine(res[2]);
                }

この特定の例では、トリックを行いました。まだ私が探しているものではありません。

于 2012-03-20T06:36:38.943 に答える