将2个REGEX简化为1个

时间:2018-10-20 10:21:28

标签: c# regex

我必须检测一个包含至少一个与第一个大写字母不同的大写字母并且不包含小写字母的字符串。 例如:

  • ABCD ! =>可接受的情况
  • Tommy Tom =>不可接受的情况
  • Let something =>不可接受的情况

这是我到目前为止使用2 Regex进行的操作:

!Regex.IsMatch(input, @"[a-z]") &&  Regex.IsMatch(input, @"[A-Z]");

我正在寻找使用单个REGEX的解决方案。

3 个答案:

答案 0 :(得分:1)

您可以使用

^(?![^a-z]*[a-z])[^A-Z]*[A-Z]

请参见regex demo

详细信息

  • ^-字符串的开头
  • (?![^a-z]*[a-z])-如果在除小写ASCII字母之外的任何0+字符之后有小写ASCII字母,则否定的超前查询将使匹配失败
  • [^A-Z]*-除大写ASCII字母外的0+个字符
  • [A-Z]-大写ASCII字母。

答案 1 :(得分:1)

一个选项是

^[^a-zA-Z]*[A-Z][^a-z]*$

重复零个或多个非字母字符,匹配一个大写字符,然后再次重复零个或多个非小写字符,直到到达字符串的末尾。

https://regex101.com/r/6JZCDr/2

第一个字符集中的A-Z不是必需的,但是它将减少步骤,因为第二个字符集的[A-Z]将匹配而没有任何回溯(如果可能的话)

答案 2 :(得分:0)

考虑一个支持多语言输入(demo)的正则表达式:

^(?=\P{Ll}*$)\P{Lu}*(\p{Lu}).*?\p{Lu}(?<!\1)

解释:

^(?=\P{Ll}*$)  # Lowercase letters are not allowed
\P{Lu}*        # Allow offset for the 1st uppercase letter
(\p{Lu})       # Capture the 1st uppercase letter
.*?            # Allow offset for the 2nd uppercase letter
\p{Lu}         # Require the 2nd uppercase letter
(?<!\1)        # ..different from the 1st uppercase letter

位置:

  • \P{Ll}的意思是“不是小写字母”
  • \P{Lu}的意思是“不是大写字母”
  • \p{Lu}的意思是“大写字母”

(请注意\P\p寄存器)