不要在同一个字符串正则表达式中重复占位符

时间:2016-06-01 18:58:40

标签: regex regex-negation

我做了一个正则表达式来验证包含 {} 所包围的变量占位符的数组:

^(\/?(([a-zA-Z0-9\-\_]+)|(\{[a-zA-Z][a-zA-Z0-9]*\}))\/?)*$

它将验证test/{a}/{b}/some-text/{a}/{a}/等字符串及其工作正常。以下是测试:https://regex101.com/r/nP1tB2/2

是否可以阻止重复的占位符?

例如,在第二个字符串中,{a}出现两次,但我想"阻止" (与之匹配的正则表达式)。

1 个答案:

答案 0 :(得分:1)

您可以使用negative lookahead来限制匹配过程:

^(?!.*{([\w-]+)}.*{\1})(\/?(([\w-]+)|(\{[a-zA-Z][a-zA-Z0-9]*\}))\/?)*$
 ^^^^^^^^^^^^^^^^^^^^^^

这意味着在检测到字符串开头之后,(?!.*{([\w-]+)}.*{\1})将检查除了换行符之后是否有0+个字符,后跟{...}子字符串(仅包含字母,数字,下划线或连字符)后面跟着相同的模式。如果找到模式,则整个匹配失败

请参阅regex demo

请注意如果您不使用Unicode感知模式(并且不是没有RegexOptions.ECMAScript的.NET),\w等于[A-Za-z0-9_]。所以,我用你的模式中的\w替换了它。否则,在前瞻和主模式中恢复该子模式。

另外,[a-zA-Z]也可以表示为[^\W\d_]\p{L}(甚至[:alpha:])和[a-zA-Z0-9] [^\W_](或{ {1}},[:alnum:])。如果您需要使模式识别Unicode,这些子模式很方便。很大程度上取决于正则表达式的味道。