正则表达式不允许3个连续字符

时间:2013-08-12 03:47:24

标签: c# regex

我有以下正则表达式:

Regex pattern = new Regex(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,20}/(.)$");

(?=.*\d)                //should contain at least one digit
(?=.*[a-z])             //should contain at least one lower case
(?=.*[A-Z])             //should contain at least one upper case
[a-zA-Z0-9]{8,20}       //should contain at least 8 characters and maximum of 20

我的问题是我还需要检查3个连续字符是否相同。在搜索时,我看到了这个解决方案:

/(.)\1\1/

然而,如果我将它与我现有的正则表达式结合起来,我仍然无法工作,但仍然没有运气:

Regex(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,20}$/(.)\1\1/");

我在这里错过了什么?谢谢!

2 个答案:

答案 0 :(得分:3)

问题是/(.)\1\1/包含了周围的/字符,这些字符用于引用某些语言(如Perl)中的文字正则表达式。但即使您不使用引号字符,也不能将其添加到正则表达式中。

在你的正则表达式的开头,你必须说“下面的内容不能包含一个跟随它自己然后再重复的字符”,如下所示:(?!.*(.)\1\1)(?!启动零宽度负前瞻断言。 “零宽度”部分意味着它不消耗输入字符串中的任何字符,“负前瞻断言”意味着它在输入字符串中向前看,以确保给定的模式不会出现在任何地方。

总而言之,你想要一个像这样的正则表达式:

new Regex(@"^(?!.*(.)\1\1)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,20}$")

答案 1 :(得分:2)

我通过反复试验解决了:

Regex pattern = new Regex(@"^(?!.*(.)\1\1)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,20}$");