我想知道是否有人可以帮助我使用C#中的正则表达式。我认为这很简单,但我一直在抨击我的大脑并且不太确定为什么我会遇到这么困难。 :)
我发现了一些例子,但我似乎无法操纵它们去做我需要的事情。
我只需要匹配任何不是“www”的字母数字+破折号子域名字符串,并且只需要匹配“。”
另外,理想情况下,如果有人输入“www.subdomain.domain.com”,我希望尽可能忽略www。如果没有,这不是一个大问题。
换句话说,我想匹配:
我不想匹配:
在我看来它应该很容易,但我遇到了“不匹配”部分的麻烦。
对于它的价值,这是用于IIS 7 URL重写模块,以重写所有非www子域。
谢谢!
答案 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.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