2017-07-27 213 views
2

有人可以帮我写RegEx表达式,它可以检查一个字符串是否包含多个大写(或小写,无所谓)字母,但不包含一排。 我需要在一个字符串中至少有两个(或更好的n)事件。如果n = 2,则有效的情况将是密码或密码或密码。在字符串中查找多个不连续的字符

当我尝试这/(?=([A-Z]{2,3}))/g它匹配PassWOrd但不PassWord。

我觉得奇怪的是它也与PaSSWOrd相匹配。我认为{2,3}中的3实际上意味着不会再有3个大写字母匹配。为什么SSWO匹配?

我尝试过类似的变化,但他们都没有为我工作(没有什么奇怪的,因为我不是很熟悉RegEx)。

这可以使用RegEx来完成吗?

+0

你必须使用正则表达式吗? – pstrjds

+1

根据您的描述,密码和PASSWord应该是一个事件,因为所有的大写字母都是连续的。你能否启发我,为什么它算作两个? –

+1

如果'n = 2','PASSWord'是否有效?我对此表示怀疑。你说那里一定只有2个大写的ASCII字母,但是这个词里有5个。 –

回答

4

(?=([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)

相关问题