的(?=([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]*$
查看regex demo。
图案的详细资料
^
- 串
(?:[^A-Z]*[A-Z]){2}
开始 - 的
[^A-Z]*
正好2随之出现 - 零个或多个字符非ASCII大写字母
[A-Z]
- 一个ASCII大写字母 个
[^A-Z]*
- 零个或多个字符的ASCII比大写字母
$
其他 - 字符串的结尾。
在C#中,使用
var strs = new List<string> { "PassWord", "PAssword", "PASSWord"};
var n = 2;
var pat = [email protected]"^(?:[^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
见online demo
请注意,如果你需要,要求在字符串2个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);
}
参见another demo。 .Count(c => (c >= 65 && c <= 90))
部分将计算字符串中任何位置的大写ASCII字母,并且res==2
将返回布尔结果,无论该数字是否等于2。它可以轻松调整数值范围。
如果您需要Unicode兼容性,请将.Count(c => (c >= 65 && c <= 90))
替换为.Where(Char.IsUpper)
。
你必须使用正则表达式吗? – pstrjds
根据您的描述,密码和PASSWord应该是一个事件,因为所有的大写字母都是连续的。你能否启发我,为什么它算作两个? –
如果'n = 2','PASSWord'是否有效?我对此表示怀疑。你说那里一定只有2个大写的ASCII字母,但是这个词里有5个。 –