3

我有以下正则表达式

Regex(@"(^http|https)://(w){0,3}(\.)?(.)*lycos\.(.)*/(.)*(&|\?)(q|query)=(.)*")

我希望它与:

http://search.lycos.com/web?q=cautare

但它不应该匹配:

http://www.google-analytics.com/__utm.gif?utmwv=5.3.9&utms=1&utmn=932580756&utmhn=search.lycos.com&utmcs=utf-8&utmsr=1920x1080&utmvp=1920x979&utmsc=32-bit&utmul=en-us&utmje=1&utmfl=11.6 r602&utmdt=searchmeup - lycos&utmhid=2063854819&utmr=0&utmp=/web?q=searchmeup&utmac=ua-2342215-18&utmcc=__utma=1.950014844.1362381742.1362387055.1362404209.3;+__utmz=1.1362387055.2.2.utmcsr=lycos.com|utmccn=(referral)|utmcmd=referral|utmcct=/;&utmu=qlag~

有没有办法使正则表达式更具限制性?

4

2 回答 2

2

(.)*(实际上应该是.*)匹配任何东西(换行符除外),这就是您的模式如此宽松的原因。

所以而不是

Regex(@"(^http|https)://w{0,3}(\.)?.*lycos\..*/.*(&|\?)(q|query)=.*")

您可以应用除 之外的其他标记.,例如[^/]用于非斜线字符、\w字母数字字符\S或非空格字符:

Regex(@"(^http|https)://w{0,3}(\.)?\w*\.lycos\.[^/]*/[^&?]*(&|\?)(q|query)=\w*")
于 2013-03-04T14:25:11.973 回答
-1

您可以大大简化您的正则表达式。

  1. 你在你的捕获组中非常自由()。只有当您有想要捕获的东西或者您有多个正则表达式字符需要一些修饰符来影响时,您才需要它们。所以你可以把所有的都(.)*改成.*.
  2. w{0,3}(\.)?部分与该部分完全无关(.)*,因此将其杀死。
  3. 我不太确定你在用 做什么,在^我看来,它只会在行首开始时匹配“http”。它会在任何地方匹配“https”。因此,要么将其删除,要么将其放在括号外。
  4. (http|https)相当于https?
  5. .*匹配任何不是换行符的内容。让我们更加严格。域名只能包含字母、数字、句点和连字符 ->[0-9a-z\-]
  6. 蒂姆的回答建议使用[^&?]*. 只要你知道你不会在一个字符串中得到一堆乱七八糟的 URL,它就会起作用。例如,它可以匹配“ http://www.lycos.com/movies blah blah blah blah http://www.google.com/?query=blah ”。您需要添加更多限制以防止出现这种情况。
  7. 在最后一个“.”之后 在域名中,您需要匹配至少 1 个字符才能使 URL 被视为可能有效。所以使用 a+而不是 a*

    Regex(@"https?://[0-9a-z\-.]*lycos\.[0-9a-z\-.]+/[^&?]*(&|\?)(q|query)=\w*");
    
于 2013-03-04T15:16:42.927 回答