正则表达式唯一结果

Regular Expression unique result

我有一个正则表达式

(?:(da|en-gb|en|\*))(?!.*)

我想得到的是匹配独特的语言类型;

比如我给enenen-gben匹配的部分是en-gben,这就是我想要的,因为前两个en重复了。

然而当我给 enenenen-gb 匹配部分是 en-gb,我得到的是 enen-gb,我认为原因是 en 是一个子串en-gb 个。但我不知道如何解决它。谁能给我一个更好的 RE?非常感谢

===================更新==============

题目背景是想设计一个accept-language的http header的Regex。所以我在这里使用(?:(da|en-gb|en|\*))(?!.*)(;q=(1|0(\.\d+)?))?(,(da|en-gb|en|\*)(;q=(1|0(\.\d+)?))?)* daen-gben只是一些示例。要知道,每种语言都可以分配一个值q来代表它的优先级。而且我不希望出现任何重复的语言类型。这就是我想要的。

我能想到的一个修复方法是将 en 更改为 en-us,因为其他语言类型是 en-gb,这是英式英语,之前的应该是美式英语。

如果您同意,那么这可能会起作用。

正则表达式: (en-gb|en-us|da)(?!)(en-gb|en-us|da)

Regex101 Demo

您可以在反向引用之后使用 (?!-) 否定前瞻来限制匹配,使其在重复的语言名称之后没有连字符:

(?:(da|en-gb|en|\*))(?!.*(?!-))(?:;q=(?:1|0(\.\d+)?))?(?:,(da|en-gb|en|\*)(?!.*(?!-))(?:;q=(?:1|0(?:\.\d+)?))?)*
                    ^^^^^^^^^^^^^                                           ^^^^^^^^^^^^^

regex demo

如果有-,则不会匹配此子串