(^[A-Z]{2}$)
正则表达式匹配仅包含两个大写ASCII字母的字符串(没有多也没有少)。
(?=([A-Z]{2,3}))
正则表达式匹配在字符串中任何位置出现的2到3个连续的大写ASCII字母。您想要匹配仅包含2到3个大写ASCII字母的字符串,不一定是连续的。
要匹配仅包含两个大写ASCII字母的字符串(没有多也没有少),请使用以下表达式:
^(?:[^A-Z]*[A-Z]){2}[^A-Z]*$
或者,如果您只允许整个字符串中包含ASCII字母:
^(?:[a-z]*[A-Z]){2}[a-z]*$
查看正则表达式演示。
模式细节
^
- 字符串开始
(?:[^A-Z]*[A-Z]){2}
- 恰好出现两次的连续字符
[^A-Z]*
- 除ASCII大写字母外的零个或多个字符
[A-Z]
- 一个ASCII大写字母
[^A-Z]*
- 除ASCII大写字母外的零个或多个字符
$
- 字符串结束。
在C#中使用
var strs = new List<string> { "PassWord", "PAssword", "PASSWord"};
var n = 2;
var pat = $@"^(?:[^A-Z]*[A-Z]){{{n}}}[^A-Z]*$";
foreach (var s in strs) {
Console.WriteLine("{0}: {1}", s, Regex.IsMatch(s, pat));
}
结果:
PassWord: True
PAssword: True
PASSWord: False
点击在线演示查看。
请注意,如果你需要在一个字符串中要求包含两个大写ASCII字母,而其他字符可以是任意字符,并不需要使用正则表达式,可以使用LINQ:
var strs = new List<string> { "PassWord", "PAssword", "PASSWord"};
var n = 2;
foreach (var s in strs) {
var res = s.Count(c => (c >= 65 && c <= 90));
Console.WriteLine("{0}: {1}", s, res == 2);
}
请参见
另一个演示。
.Count(c => (c >= 65 && c <= 90))
部分将计算字符串中任何位置的大写ASCII字母数,
res==2
将返回一个布尔结果,即数字是否等于2。它可以轻松地调整为数字范围检查。
如果需要Unicode兼容性,请用
.Where(Char.IsUpper)
替换
.Count(c => (c >= 65 && c <= 90))
。
n=2
,那么PASSWord
应该是有效的吗?我怀疑。你说这个单词中只能有两个大写 ASCII 字母,但实际上有五个。 - Wiktor Stribiżew