我有一个正则表达式,可以接受由空格分隔的几个大写字符:
^([A-Z]{2})([ ][A-Z]{2})*$
我想确保每个字符只出现一次:
例如,良好的输入:
AB CD XY
输入不好:
A B B C
答案 0 :(得分:4)
您应在正则表达式下面加正则表达式:
(?!.*?([A-Z]).*\1)
但是它应该在插入符号^
之后。我将其分解:
(?!
否定超前开始
.*?
懒惰的点星星,以懒惰地扩展匹配项([A-Z])
匹配并捕获A和Z之间的大写字母.*
贪婪的点星可贪婪地扩展匹配项(可能是懒惰的)\1
匹配上一个捕获组中捕获的任何内容)
否定超前结束整个正则表达式为:
^(?!.*?([A-Z]).*\1)([A-Z]{2})([ ][A-Z]{2})*$
但是请注意,这会更改捕获组的顺序,因为它会在所有其他捕获组之前添加一个捕获组(因此,如果它们是在1
和2
中捕获的,则它们现在是2
和3
)。如果您不需要单独返回它们,这意味着您不需要捕获组,则将它们变成非捕获组:
^(?!.*?([A-Z]).*\1)[A-Z]{2}(?:[ ][A-Z]{2})*$
由于.NET支持无限回溯,因此更好的方法是利用此功能:
^[A-Z]{2}(?:[ ][A-Z]{2})*$(?<!\1.*([A-Z]).*?)