Regex 用于提取域的第一次出现的正则表达式

Regex 用于提取域的第一次出现的正则表达式,regex,regex-lookarounds,regex-group,Regex,Regex Lookarounds,Regex Group,我在每行上都有一个域列表,如下所示 www.google.dk/ www.google.dk/ www.google.com/ www.google.de/ www.google.dk/ www.google.dk/ 我只希望每个域出现第一次,如下所示: www.google.dk/ www.google.com/ www.google.de/ 我到处都找过类似的话题,但找不到适合我的东西。这个正则表达式应该适合你 (?如果它没有第一个匹配项,但也可以是最后一个匹配项(即,您只

我在每行上都有一个域列表,如下所示

www.google.dk/

www.google.dk/

www.google.com/

www.google.de/

www.google.dk/

www.google.dk/
我只希望每个域出现第一次,如下所示:

www.google.dk/

www.google.com/

www.google.de/

我到处都找过类似的话题,但找不到适合我的东西。

这个正则表达式应该适合你


(?如果它没有第一个匹配项,但也可以是最后一个匹配项(即,您只需要唯一的域),则可以再次对匹配组使用负前瞻

([^\n]+)(?!.*\1)
(使用
([^\n]+)
匹配域,使用每个域位于一行的事实;您也可以在此处使用更复杂的域匹配正则表达式。)


尽管如此,这类任务应该很容易使用代码完成,就像我在上面的评论中所描述的那样,它将所有URL放在
Set
集合中,这样可以消除所有重复项,然后只需迭代
Set
即可获得唯一的URL

但如果由于某些限制,您需要纯正则表达式解决方案,那么您可以使用此正则表达式

(\S+)(?![\w\W]*\1)
它将只捕获一次重复的URL,因为此URL实际上捕获了重复URL中的最后一个字符串

正则表达式解释:

  • (\S+)
    -使用
    \S+
    捕获URL,因为URL本身不能包含空格
  • (?![\w\w]*\1)
    -这种负向前看确保使用反向引用
    \1
    [\w\w]在前面任何地方都看不到组1中捕获的字符串
    是一种匹配任何字符(包括换行符)的方法,尽管您可以使用点来实现相同的匹配,但是您需要启用
    DOTALL
    模式,方法是将
    (?s)
    放在正则表达式的开头,或者在您的语言选择中传递一个额外的参数标志(如果它支持)

为什么不找到解决问题的更简单的方法,例如不使用正则表达式?将这些域放在一个集合中,然后从集合中取回。集合只包含唯一的元素,因此将删除重复的元素。您知道吗?它必须是正则表达式,因为它位于另一个程序中,这是唯一的解决方案-Sorryt你使用什么工具/语言?正则表达式取决于它…这个工具/语言肯定会提供比使用正则表达式(如集合)更简单的解决方法。请给这个表达式添加一些解释。它如何处理多次出现的情况?好的,我将把它分解为几个部分。•正面回顾-(?请将所有此类信息添加到答案本身,而不是添加到评论部分
(\S+)(?![\w\W]*\1)