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

任何人都可以帮助我,非常感谢。

提前致谢, 阿米特 Prajapati

4

2 回答 2

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 回答
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 或 #(anchors) 开头的链接。

在这里你可以看到,我们正在捕获命名组,组的名称是“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
///  

这样您就不需要在循环中运行第二个正则表达式。您将获得绝对和相对 url。

希望能帮助到你...

于 2012-07-22T08:32:05.347 回答