我在构建非常复杂的正则表达式时遇到了问题。这些是我的约束:
- 长度:8 到 10
- 不能以数字或下划线开头
- 至少有一个大写字母,一个数字和一个字符 以下 3 个特殊字符:_$£
我以为我做到了这一点:
^([^0-9_])(?=.*[A-Z])(?=.*[0-9])(?=.*[$£_])[A-Za-z0-9$£_]{7,9}$
它正确地使第一个语句失败:
- aDf123_ 失败,因为它的长度不是 8
- aDf123_aAAFF 失败,因为它的长度超过 10
它正确地使第二个语句失败:
- _aDf1234 失败,因为它以下划线开头
- 1aDf1234 失败,因为它以数字开头
它正确地使第三条语句失败:
- aaDf1234 失败,因为它没有任何特殊字符
- aadf1$34 失败,因为它没有大写字母
- aaDf$£££ 失败,因为它没有数字
最后,它使用有效字符串通过验证:aaDf$££5
问题是什么?问题是以下字符串在应该通过验证时失败了:Daaa$444
当大写字母是第一个字母时,我的正则表达式看不到它。我怎样才能让它看到它?我知道这与我的正则表达式以 {7,9} 而不是 {8,10} 结尾的事实有关,但我无能为力,因为我必须定义它不能以数字或下划线开头......
最佳答案
您需要在 ^
之后放置 lookaheads 并将 [^0-9_]
替换为 [A-Za-z$£]
:
^(?=.*[A-Z])(?=.*[0-9])(?=.*[$£_])[A-Za-z$£][A-Za-z0-9$£_]{7,9}$
参见 this regex demo .
否则,第一个 [^0-9_]
匹配 ^
、&
等不是数字或 _
并且前瞻仅在第一个字符之后 寻找所需的模式。 因此,任何仅在其开头具有必需字符的有效字符串都将失败。
或者,将 [^0-9_]
变成负的 (?![0-9_])
前瞻(然后你需要替换 {7,9}
和 {8,10}
在末尾,因为前瞻模式是非消耗性的):
^(?![0-9_])(?=.*[A-Z])(?=.*[0-9])(?=.*[$£_])[A-Za-z0-9$£_]{8,10}$
参见 this regex demo .
关于javascript - 正则表达式强制特定长度,同时不以数字开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42155529/