javascript - 正则表达式强制特定长度,同时不以数字开头

标签 javascript regex

我在构建非常复杂的正则表达式时遇到了问题。这些是我的约束:

  1. 长度:8 到 10
  2. 不能以数字或下划线开头
  3. 至少有一个大写字母,一个数字和一个字符 以下 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/

相关文章:

javascript - 从 Q promise 中崩溃应用程序而不是通过一系列 promise 传播拒绝?

javascript - Fabricjs:在拖动时显示水平和垂直位置线

python - 多行正则表达式

html - 如何在正则表达式中停止于下一个特定字符

javascript - 在 webpack 的多个编译器配置中提取公共(public) block ?

javascript - 有没有办法根据 Angular 中的元素数量更改 col-md 类?

javascript - 如何每 15 秒调用一次 javascript 函数,仅持续 5 分钟以及如何检查页面空闲一段时间

r - 如何在字符串中添加值

java - 如何在 Java 中保留分隔符的同时在不同分隔符之间分割文本?

javascript - 无法让 JavaScript RegEx 工作