我做了一个正则表达式来验证包含 {和} 所包围的变量占位符的数组:
^(\/?(([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}
出现两次,但我想"阻止" (与之匹配的正则表达式)。
答案 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,这些子模式很方便。很大程度上取决于正则表达式的味道。