除了" www"?之外的任何字符串的正则表达式(子域)

时间:2011-08-17 20:58:39

标签: c# asp.net regex string rewrite

我想知道是否有人可以帮助我使用C#中的正则表达式。我认为这很简单,但我一直在抨击我的大脑并且不太确定为什么我会遇到这么困难。 :)

我发现了一些例子,但我似乎无法操纵它们去做我需要的事情。

我只需要匹配任何不是“www”的字母数字+破折号子域名字符串,并且只需要匹配“。”

另外,理想情况下,如果有人输入“www.subdomain.domain.com”,我希望尽可能忽略www。如果没有,这不是一个大问题。

换句话说,我想匹配:

  • (测试) .domain.com
  • (TEST2) .domain.com
  • (适用wwwasdf) .domain.com
  • (适用asdfwww) .domain.com
  • (w)的 .domain.com
  • (适用wwwwww) .domain.com
  • (适用ASFD-12345 WWW的香蕉) .domain.com
  • 万维网。的(子域) .domain.com

我不想匹配:

  • (WWW) .domain.com

在我看来它应该很容易,但我遇到了“不匹配”部分的麻烦。

对于它的价值,这是用于IIS 7 URL重写模块,以重写所有非www子域。

谢谢!

7 个答案:

答案 0 :(得分:8)

域名的其余部分是否保持不变,例如.domain.com,就像您的示例中一样?试试这个:

\b(?!www\.)(\w+(?:-\w+)*)(?=\.domain\.com\b)

说明:

  • \w+(?:-\w+)*与您描述的通用域名组件匹配(但更严格一些)。

  • (?=\.domain\.com\b)确保它是第一个子域名(即实际域名之前的最后一个子域名)。

  • \b(?!www\.)确保它不是www.(没有\b,它可以跳过第一个w并仅匹配ww. })。

在我的测试中,此正则表达式与您在示例中突出显示的部分完全匹配,并且与最后两个示例中的www.匹配。


编辑:这是另一个与整个名称相匹配的版本,捕获不同组中的作品:

^((?:\w+(?:-\w+)*\.)*)((?!www\.)\w+(?:-\w+)*)(\.domain\.com)$

在大多数情况下,组$1将包含一个空字符串,因为子域名之前没有任何内容,但这里是它如何分解www.subdomain.domain.com

$1: "www."
$2: "subdomain"
$3: ".domain.com"

答案 1 :(得分:2)

^www\.

并反转该位的逻辑,因此如果匹配,则表示您的字符串不符合您的要求。

答案 2 :(得分:1)

只需将原始内容替换为www之后的所有内容(如果存在)(伪代码):

str = re.sub("(www\.)?(.+)", "\2", str)

或者,如果您只想匹配“错误”的那些,请使用:

(www\.([^.]+)\.([^.]+))

如果你必须匹配所有好用的东西:

(([^w]|w[^w]|ww[^w]|www[^.]|www\.([^.]+)\.([^.]+)\.).+)

答案 3 :(得分:1)

在这里大声思考:

^(?:www\.)?([^\.]+)\.([^\.]+)\.

其中...

  • (?: WWW \。)?在开始时寻找可能的“www”,非捕获
  • ([^ \。] +)\。寻找子域(除了点之外的任何东西,至少一次,直到一个点)
  • ([^ \。] +)\。查找域,以点结尾(除了点之外的任何内容,至少一次,直到点)

注意:此表达式不适用于双子域: www.subsub.sub.domain.com

答案 4 :(得分:1)

此:

^(?:www\.)?([^.]*)

它与您在问题中的括号中的确切匹配。您将在小组(1)中找到答案。您必须将其锚定到行的开头。使用此:

^(?:www\.)?(.*)    

如果您想要除“www。”之外的URL中的所有内容。您未在测试用例中包含的一个示例是“alpha.subdomain.domain.com”。如果您需要匹配除了“www。”之外的所有内容,而不是字符串的“domain.com”部分,请使用:

^(?:www\.)?(.+)((?:\.(?:[^./\?]+)){2})

它将解决您的所有情况,但此外,还将从我的附加测试用例中返回“alpha.subdomain”。并且,对于一个安可,在组2中放置“.domain.com”,如果网址中有目录或参数,则不会匹配。

我验证了所有这些回复here

最后,为了矫枉过正,如果你想拒绝以“www。”开头的地址,你可以使用负面的背后隐藏:

^....(?<!www\.).*

答案 5 :(得分:1)

这有效:

^(?!www\.domain\.com)(?:[a-z\-\.]+\.domain\.com)$

或者,使用Java(或C#?)字符串的必要反斜杠:

"^(?!www\\.domain\\.com)(?:[a-z\\-\\.]+\\.domain\\.com)$"

可能有一种更简洁的方式(即只输入domain.com一次),但这有效..

答案 6 :(得分:0)

以为我会分享这个。

(\\.[A-z]{2,3}){1,2}$

从最后删除任何'.com.au''。co.uk'。然后,您可以执行其他查找以检测URL是否包含子域。

E.g。

subdaomin1.sitea.com.au
subdaomin2.siteb.co.uk
subdaomin3.sitec.net.au

全部成为:

subdomain1.sitea
subdomain2.siteb
subdomain3.sitec