我有一个文本,其中包含以下格式的网址域:
[second_level_domain].[top_level_domain]
这可以是例如 test.com , amazon.com 或类似的东西,但不是更复杂的东西,例如 www.test.com 或 de.wikipedia.org (无子级域名!)。
可能是在点的前面(在第二级和顶级域之间)或者在点之后是像 test这样的可选空间。 com ,但并非总是如此。
然而,我不想匹配的是,如果二级域名和顶级域名属于电子邮件地址,例如 hello@test.org 。所以在这种情况下,它不应该提取 test.org
我现在写了以下正则表达式:
(?<!@)(([a-zA-Z\d]+(?:-[a-zA-Z\d]+)*(?<!www))\s?\.\s?(com|net|org))
有了负面看法我想确定,在二级域名前面不应该是@。然而,它并没有真正达到我的预期。例如,在 hello@test.org 文本中,它提取 est.org 而不是提取任何内容。所以,显然它只会在检查前面是否有@时查看第一个字符。但是,当我使用以下正则表达式时,似乎可以使用文本 hello@test.org :
(?<!@)((test)\s?\.\s?(com|net|org))
在这里,我对第二级域进行了硬编码,并使用它。但是,如果我用匹配所有类型的二级域的正则表达式交换它
([a-zA-Z\d]+(?:-[a-zA-Z\d]+)*(?<!www))
它不再起作用了。看起来背后的负面外观已经在第一个角色匹配后使用,并且它没有等待负面观察,直到所有内容都匹配。
作为替代方案,我可以匹配更多,然后使用组来构建我想要的匹配,但我想尽可能避免这种情况。我想立即正确匹配。我不是正则表达式的专家,显然我还没有理解周围环境。有没有办法写一个正则表达式,其行为与我想要的一样?
答案 0 :(得分:0)
(?:^|(?<=\s))((?:[a-zA-Z\d]+(?:-[a-zA-Z\d]+)*(?<!www))\s?\.\s?(?:com|net|org))
添加锚点以禁止部分匹配。参见演示。