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

标签 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/");

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

最佳答案

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

在你的正则表达式的开头,你必须说“后面不能包含一个字符,后面跟着它自己,然后又是它自己”,像这样:(?!.*(.)\1\1)(?! 开始一个零宽度负先行断言。“零宽度”部分意味着它不消耗输入字符串中的任何字符,而“negative lookahead assertions”意味着它在输入字符串中向前看,以确保给定的模式不会出现在任何地方。

总而言之,您需要这样的正则表达式:

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

关于c# - 正则表达式不允许连续 3 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18179286/

相关文章:

c# - 如何使用c#读取二进制文件?

c# - 没有 Entity Framework DbContext 的 OWIN 配置

php - 根据括号递归地按逗号展开

C++比较并替换stringstream的最后一个字符

python 正则表达式 - 如何获取一行中的所有名称?

r - 大数据集上的高效子字符串搜索

c# - 如何使用 C# linq 查询获取 "start"项目值?

javascript - 重定向到在 angularjs 中不起作用的网页

c# - JWT 不记名 token 不适用于 ASP.Net Core 3.1 + Identity Server 4

python - 从 HTML 中删除 Script 标签和 on 属性