不要在同一个字符串正则表达式中重复占位符
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+ 个字符,而不是换行符后跟一个 {...}
子字符串(只有字母,数字,下划线或连字符)后跟相同的模式。如果找到模式,则整个匹配失败。
请注意,如果您不使用 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,这些子模式会很方便。很大程度上取决于正则表达式的风格。
我制作了一个正则表达式来验证包含由 { 和 }:
包围的变量占位符的数组^(\/?(([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+ 个字符,而不是换行符后跟一个 {...}
子字符串(只有字母,数字,下划线或连字符)后跟相同的模式。如果找到模式,则整个匹配失败。
请注意,如果您不使用 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,这些子模式会很方便。很大程度上取决于正则表达式的风格。