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

Do not repeat placeholders in the same string regex

我制作了一个正则表达式来验证包含由 {}:

包围的变量占位符的数组
^(\/?(([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}出现了两次,但我想"block"(不匹配的正则表达式)它。

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

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

这意味着在检测到字符串的开头后,(?!.*{([\w-]+)}.*{}) 将检查是否有 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_](或 [:alnum:][\p{L}\p{N}])。如果您需要使模式识别 Unicode,这些子模式会很方便。很大程度上取决于正则表达式的风格。