正则表达式太松散了

时间:2013-03-04 14:19:19

标签: .net regex

我有以下正则表达式

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~

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

2 个答案:

答案 0 :(得分:2)

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

所以而不是

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

您可以应用除.之外的其他令牌,例如[^/]表示非斜杠字符,\w表示字母数字字符,\S表示非空格字符:

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

答案 1 :(得分:-1)

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

  1. 你的捕获组()非常自由。只有当你想要捕获的东西或者你想要一些修饰符才能生成多个正则表达式字符时,你才需要它们。因此,您可以将所有(.)*更改为.*
  2. w{0,3}(\.)?部分与(.)*部分毫无意义,所以请将其删除。
  3. 我不太清楚你在使用^做了什么,它在我看来它只会在一行开头时匹配“http”。它会在任何地方匹配“https”。所以要么把它移走,要么把它放在parens之外。
  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视为可能有效。因此,请使用+代替*

    Regex(@"https?://[0-9a-z\-.]*lycos\.[0-9a-z\-.]+/[^&?]*(&|\?)(q|query)=\w*");