2

""内に/thumb/が含まれているすべてのリンクを抽出しようとしています。実際、私は画像srcを使用するだけで済みます。画像がjpgで終わるのか、大文字と小文字の区別の問題があるのか​​などはわかりません。実際には、完全なリンクのみを気にします。

m = Regex.Match(page, @"""(.+?/thumbs/.+?)""");
//...
var thumbUrl = m.Groups[1].Value;

私の完全なコード

    var page = DownloadWebPage(url);
    var reg = new Regex(@"Elements\s+\((.*)\)", RegexOptions.Multiline);
    var m = reg.Match(page);
    var szEleCount= m.Groups[1].Value;
    int eleCount = int.Parse(szEleCount);

    m = Regex.Match(page, @"""(.+?/thumbs/.+?)""");
    while (m.Success)
    {
        var thumbUrl = m.Groups[1].Value;
        //i break here to see a problem
        m = m.NextMatch();
    }

thumbUrlは次のようになります

center \ "> ...テキストが多く、/ thumbs / ... src = \" http://images.fdhkdhfkd.com/thumbs/dfljdkl/22350.jpg

4

5 に答える 5

4

エンジンが多くのバックトラッキングを行う必要があるため、貪欲でない正規表現は遅くなる可能性があります。

これは貪欲な表現のみを使用しています。

@"""([^""]*/thumbs/[^""]*)"""

最小限のものに一致する代わりに、可能な限り多くの非二重引用符に一致します。

于 2009-11-14T15:08:11.967 に答える
3

(X)HTML を解析している場合は、適切なパーサーの使用を検討してください。

参照: C# で html を解析する最良の方法は何ですか? その方法のいくつかの C# の例については。

于 2009-11-14T15:10:58.573 に答える
3

気が進まない (貪欲ではない) 量指定子が機能する方法は、一致し始めると、最初の機会で停止することです。あなたがしようとしているのは、基準を満たす最小量のテキストに一致させることですが、これは同じことではありません。必要な前にマッチングを開始しないようにする必要があります。他の人が示唆しているよう.+?に、正規表現の を のように引用符と一致しないものに置き換えることでそれを行うことができます[^""]+

しかし、それでもパフォーマンスの問題が残ります。あなたの例では、正規表現は引用符が表示されると一致を開始しcenter">ます。引用符に到達するとsrc="( を に変更したと仮定し.+?[^""]+)、その一致の試行を中止し、先に進みます。引用符で始まる次の試行src="は成功します。したがって、正しい結果が得られていますが、最初の失敗したマッチ試行で多くの時間を無駄にしています。

高速な正規表現を作成するための鍵は、一致の試行が失敗する場合に、できるだけ早く失敗するようにすることです。たとえば、 と の間に山かっこは必要ないと想定しても安全だと思う"ので/thumbs/、一致させたくない文字のセットにそれらを追加します: [^""<>]+。これで、引用符で始まる一致の試行は、center">次の位置で中止されます。

正規表現をさらに最適化するためにできることは他にもあります。これには、アトミック グループと否定先読みが含まれますが、これはおそらく必要なだけ高速になります。

@"""([^""<>]+/thumbs/[^""<>]+)"""
于 2009-11-14T19:46:30.983 に答える
1

問題は、.+? "s も消費するため、src 属性の外でも引き続き一致します。代わりに、次のように使用します。

m = Regex.Match(page, @"""([^""]+/thumbs/[^""]+)""");
于 2009-11-14T15:07:03.277 に答える
0

通常、正規表現がある場合は、静的フィールドを使用してRegexOptions.Compiledオプションを指定します。

static Regex template = new Regex(@"""(.+?/thumbs/.+?)""", RegexOptions.Compiled | RegexOptions.Multiline)
于 2009-11-14T15:44:32.470 に答える