出现一次的字符串中的每个字母的正则表达式

时间:2018-11-05 08:55:53

标签: c# regex

我有一个正则表达式,可以接受由空格分隔的几个大写字符:

^([A-Z]{2})([ ][A-Z]{2})*$

我想确保每个字符只出现一次:

例如,良好的输入:

  

AB CD XY

输入不好:

  

A B B C

1 个答案:

答案 0 :(得分:4)

您应在正则表达式下面加正则表达式:

(?!.*?([A-Z]).*\1)

但是它应该在插入符号^之后。我将其分解:

  • (?!否定超前开始
    • .*?懒惰的点星星,以懒惰地扩展匹配项
    • ([A-Z])匹配并捕获A和Z之间的大写字母
    • .*贪婪的点星可贪婪地扩展匹配项(可能是懒惰的)
    • \1匹配上一个捕获组中捕获的任何内容
  • )否定超前结束

整个正则表达式为:

^(?!.*?([A-Z]).*\1)([A-Z]{2})([ ][A-Z]{2})*$

请参见live demo here

但是请注意,这会更改捕获组的顺序,因为它会在所有其他捕获组之前添加一个捕获组(因此,如果它们是在12中捕获的,则它们现在是23)。如果您不需要单独返回它们,这意味着您不需要捕获组,则将它们变成非捕获组:

^(?!.*?([A-Z]).*\1)[A-Z]{2}(?:[ ][A-Z]{2})*$

由于.NET支持无限回溯,因此更好的方法是利用此功能:

^[A-Z]{2}(?:[ ][A-Z]{2})*$(?<!\1.*([A-Z]).*?)

请参见live demo here