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

我想知道是否有人可以帮助我使用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-bananas) .domain.com
  • 万维网。 (子域名) .domain.com

我不想匹配:

  • (www) .domain.com

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

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

谢谢!

域名的其余部分是否为常量,例如.domain.com ,如示例中所示? 试试这个:

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

说明:

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

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

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

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


编辑:这是另一个匹配整个名称的版本,捕获不同组中的碎片:

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

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

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

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

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

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

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

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

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

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

只是在这里大声思考:

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

哪里…

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

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

这个:

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

它完全匹配您在问题中括号中的内容。 您将在小组(1)中找到答案。 您必须将其锚定到行的开头。 用这个:

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

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

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

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

我在这里validation了所有这些回复。

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

 ^....(? 

这有效:

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

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

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

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

以为我会分享这个。

 (\\.[Az]{2,3}){1,2}$ 

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

例如

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

全部成为:

subdomain1.sitea
subdomain2.siteb
subdomain3.sitec