Regex 带有负look-behind的正则表达式仍然匹配Scala中的某些字符串

Regex 带有负look-behind的正则表达式仍然匹配Scala中的某些字符串,regex,scala,Regex,Scala,我有一个文本,包含以下形式的url域: [second_level_domain].[top_level_domain] 例如,test.com、amazon.com或类似的东西,但不包括更复杂的东西,例如www.test.com或de.wikipedia.org(无子级别域!) 可能是在点的前面(第二级和顶级域之间)或点的后面是一个可选的空格,如test。com,但情况并非总是如此 但是,我不想匹配的是,第二级域和顶级域是否属于电子邮件地址,例如hello@test.org。所以在这种情况下

我有一个文本,包含以下形式的url域:

[second_level_domain].[top_level_domain]
例如,test.comamazon.com或类似的东西,但不包括更复杂的东西,例如www.test.comde.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而不是什么都不提取。因此,显然,它只在检查第一个字符时才查看如果前面有一个@,则为ks。但是当我使用下面的正则表达式时,它似乎对文本起作用hello@test.org

(?<!@)((test)\s?\.\s?(com|net|org))
(?
在这里,我硬编码了第二级域,它与之一起工作。但是,如果我将其与匹配各种第二级域的正则表达式交换

([a-zA-Z\d]+(?:-[a-zA-Z\d]+)*(?<!www))
([a-zA-Z\d]+(?:-[a-zA-Z\d]+)*(?)?
它不再起作用了。看起来在匹配第一个字符之后,负片后面的外观已经被使用了,而且它不会等待负片后面的外观,直到所有内容都匹配为止

作为替代,我可以进行更多的匹配,然后再使用组来构建我想要的匹配,但如果可能的话,我想避免这种情况。我想立即正确匹配它。我不是正则表达式专家,显然我还没有正确理解环顾四周。有没有一种方法可以编写一个正则表达式,其行为类似于我想要什么?
(?:^|(?<=\s))((?:[a-zA-Z\d]+(?:-[a-zA-Z\d]+)*(?<!www))\s?\.\s?(?:com|net|org))
添加锚以禁止部分匹配。请参阅演示


如果我理解正确,您建议我检查它是否以“^”开头,是否以“$”结尾?如果是,那么它对我不起作用,因为我有更多的文本。例如:您可以向foo.com的地址发送电子邮件hello@test.org这里我想提取foo.com,但是不是test.org。但是与^and&不匹配,是吗?是的,它很有效!太棒了!非常感谢你的帮助。我只是忘了提到,@前面或后面可能会出现一个空格。但是当我使用(?我会给你的答案投赞成票,但不幸的是我做不到。)(@bam098我们不必担心
@
因为我们不捕获它。我们只需确保我们捕获的任何东西背后都有一个空间。同样,我们不捕获
@
我们也不关心
电子邮件
:)