regex 如何检查正则表达式字符串是否以特殊字符开头

ndasle7k  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(192)

我在C#中有一个工作的正则表达式模式。NET,它的工作原理和预期的一样好。我只是想更新这个模式,以确保与这个正则表达式比较的任何字符串都不会以任何特殊字符开头。
我的现有正则表达式

(@"^(?=.*[A-Z])(?=.*[!\{\}\[\]@#$%^&*()+_<>~-])(?=.*[0-9])(?=.*[a-z]).{8,15}$");

例如
TestHey@123!-通过
@TestHey123!-这应该失败,因为在开头有特殊字符。

ezykj2lf

ezykj2lf1#

您可以通过简单地为密码的第一个符号指定字符类,与接下来的七到十五个符号分开:

^(?=.*[A-Z])(?=.*[!\{\}\[\]@#$%^&*()+_<>~-])(?=.*[0-9])(?=.*[a-z])[^!\{\}\[\]@#$%^&*()+_<>~-].{7,14}$

这将排除特别列出的符号。但其他符号如ё将被允许。
如果需要拉丁字母或数字之一,可以通过以下方式指定:

^(?=.*[A-Z])(?=.*[!\{\}\[\]@#$%^&*()+_<>~-])(?=.*[0-9])(?=.*[a-z])[a-zA-Z0-9].{7,14}$

演示here

qltillow

qltillow2#

在开始时使用\b word boundary强制使用word character,但不包括下划线。其优点是,如果适用,正则表达式将在触发lookahead之前立即失效。此外,我建议在lookaheads中所需的字符之前使用否定(效率)。

^\b(?!_)                         # start with a word character excluding underscore
(?=\D*\d)                        # look ahead for a digit preceded by any non-digits
(?=[^A-Z]*[A-Z])                 # look ahead for an upper preceded by any non-upper
(?=[^a-z]*[a-z])                 # look ahead for a lower preceded by any non-lower
(?=.*[!{}\[\]@\#$%^&*()<>_~+\-]) # one special character preceded by any characters
.{8,15}$                         # 8 to 15 characters until the end

See this demo at regex101(演示中的\n只是为多行测试添加)- Regex在一行中:

^\b(?!_)(?=\D*\d)(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=.*[!{}\[\]@\#$%^&*()<>_~+\-]).{8,15}$

相关问题