我必须检测到一个字符串,该字符串包含至少一个大写字母,与第一个字母不同,并且不包含小写字母。例如:
ABCD !
=>可接受案例Tommy Tom
=>不可接受的情况Let something
=>不可接受的情况这里是我使用2 Regex所做的工作:
!Regex.IsMatch(input, @"[a-z]") && Regex.IsMatch(input, @"[A-Z]");
我正在寻找一个使用单一REGEX的解决方案。
发布于 2018-10-20 10:23:24
你可以用
^(?![^a-z]*[a-z])[^A-Z]*[A-Z]
见regex演示
详细信息
^
-字符串的开始(?![^a-z]*[a-z])
-如果在除小写ASCII字母之外的任何0+字符后面都有小写的ASCII字母,则会导致匹配失败。[^A-Z]*
- 0+字符(大写字母除外)[A-Z]
-大写的ASCII字母。发布于 2018-10-20 10:27:30
一种选择是
^[^a-zA-Z]*[A-Z][^a-z]*$
重复零个或多个非字母字符,匹配大写字符,然后再重复零个或多个非小写字符,直到到达字符串的末尾。
https://regex101.com/r/6JZCDr/2
第一个字符集中的A-Z
并不是必需的,但是它将导致更少的步骤,因为第二个字符集的[A-Z]
将匹配而不进行任何回溯(如果可能的话)。
发布于 2018-10-20 22:22:32
考虑支持多语言输入(演示)的正则表达式:
^(?=\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
寄存器)
https://stackoverflow.com/questions/52904607
复制相似问题