我有一个正则表达式
(?:(da|en-gb|en|\*))(?!.*\1)
我想要的是匹配唯一的语言类型;
例如,我提供enenen-gben
匹配部分为en-gben
,这就是我想要的,因为前两个en
会重复。
但是当我提供enenenen-gb
匹配部分为en-gb
时,我得到的是enen-gb
,我认为原因是en
是en-gb
的子字符串{1}}。但我不知道如何解决它。谁能给我一个更好的RE?非常感谢
===================更新==============
问题的背景是我想为accept-language的http标头设计一个Regex。我在这里使用(?:(da|en-gb|en|\*))(?!.*\1)(;q=(1|0(\.\d+)?))?(,(da|en-gb|en|\*)(;q=(1|0(\.\d+)?))?)*
da
,en-gb
,en
只是一些示例。您知道,可以为每种语言分配值q来表示其优先级。我不希望出现任何重复的语言类型。这就是我想要的。
答案 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 强>