1

正規表現で問題が発生しています。

指定された文字列からすべての URL を取得したいのですが、.jpg、.css、.js、.gif などで終わる URL は取得したくありません。

これが私の ASP.NET C# コードです。

    using (var client = new WebClient())
    {
        client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows; U;   Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
        string result = client.DownloadString(strBasicUrl);

        Regex MyRegex = new Regex("http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.Multiline | RegexOptions.CultureInvariant | RegexOptions.Compiled);
        MatchCollection matches = MyRegex.Matches(result);
        foreach (var item in matches)
        {
            litResult.Text += item.ToString() + "<br>";
        }
    }

この正規表現を変更したい....

strBasicUrl "http://www.Microsoft.com" をリクエストすると、
URLの下に結果はありません
例えば
http://i.microsoft.com/en-us/homepage/shared/templates/components/hpSearch/images/searchSprite.ltr.gif
http://i.microsoft.com/global/ImageStore/PublishingImages/Asset/Header/logo_skype.png

誰でも私を助けてくれますか?

前もって感謝します、 アミット・プラジャパティ

4

2 に答える 2

1

マイクはすでにあなたの質問に答えていると思いますが、あなたが質問をして以来、私はこれについて考えていました。あなたの質問のおかげで、正規表現で先読み、後ろ向き、後ろ向きを学びました。

したがって、ループで正規表現を実行したくない場合は、次の1つの方法があります。

public Regex MyRegex = new Regex(
  "href=\"(?<URL>(?:(?!javascript)(?!#))[a-zA-Z0-9\\~\\!\\@\\#\\$"+
  "\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]+)"+
  "(?<!(?:\\.png|\\.js|\\.jpg|\\.jpeg|\\.css|\\.gif|\\.zip|\\.r"+
  "ar))\"(?:$|>|\\s)",
RegexOptions.Multiline
| RegexOptions.CultureInvariant
| RegexOptions.Compiled
);

読みやすくするために、正規表現(エスケープシーケンスなし)を次に示します。

href="(?<URL>(?:(?!javascript)(?!#))[a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]+)(?<!(?:\.png|\.js|\.jpg|\.jpeg|\.css|\.gif|\.zip|\.rar))"(?:$|>|\s)

クローラーを開発していると仮定すると、正規表現は相対リンクと一致しません。相対リンクと一致する場合、javascriptまたは#(アンカー)で始まるリンクと一致しないようにする必要があります。

ご覧のとおり、名前付きグループをキャプチャしています。グループの名前は「URL」です。したがって、使用する必要のあるURL部分を取得するには(すでに知っているかもしれません):

match.Groups["URL"]

正規表現の説明は次のとおりです。

///      href="
///  [URL]: A named capture group. [(?:(?!javascript)(?!#))[a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]+]
///      (?:(?!javascript)(?!#))[a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]+
///          Match expression but don't capture it. [(?!javascript)(?!#)]
///              (?!javascript)(?!#)
///                  Match if suffix is absent. [javascript]
///                      javascript
///                          javascript
///                  Match if suffix is absent. [#]
///                      #
///          Any character in this class: [a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,], one or more repetitions
///  Match if prefix is absent. [(?:\.png|\.js|\.jpg|\.jpeg|\.css|\.gif|\.zip|\.rar)]
///      Match expression but don't capture it. [\.png|\.js|\.jpg|\.jpeg|\.css|\.gif|\.zip|\.rar]
///          Select from 8 alternatives
///              \.png
///                  Literal .
///                  png
///              \.js
///                  Literal .
///                  js
///              \.jpg
///                  Literal .
///                  jpg
///              \.jpeg
///                  Literal .
///                  jpeg
///              \.css
///                  Literal .
///                  css
///              \.gif
///                  Literal .
///                  gif
///              \.zip
///                  Literal .
///                  zip
///              \.rar
///                  Literal .
///                  rar
///  "
///  Match expression but don't capture it. [$|>|\s]
///      Select from 3 alternatives
///          End of line or string
///          >
///          Whitespace
///  

このように、ループで2番目の正規表現を実行する必要はありません。そして、絶対URLと相対URLの両方を取得します。

それが役に立てば幸い...

于 2012-07-22T08:32:05.347 に答える
1

あなたがマッチを取得した後、私は単純にそれを行います (nhahtdh に感謝):

    foreach (var item in matches)
        if (!Regex.IsMatch (item.Value, @"\.(jpg|gif)$"))
            litResult.Text += item.ToString() + "<br>";
于 2012-07-22T06:28:21.543 に答える