正则表达式唯一结果

时间:2016-04-05 09:14:49

标签: regex http-headers substring

我有一个正则表达式

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

我想要的是匹配唯一的语言类型;

例如,我提供enenen-gben匹配部分为en-gben,这就是我想要的,因为前两个en会重复。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

请参阅regex demo

如果有-,则此子字符串将不匹配。

答案 1 :(得分:0)

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

如果你对它没问题,那么这可能会如下工作。

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

<强> Regex101 Demo