3

我需要构建一个具有以下约束的 JavaScript 正则表达式:

  • 输入字符串至少需要 6 个字符长
  • 输入字符串需要至少包含 1 个字母字符
  • 输入字符串需要至少包含 1 个非字母字符

我严重缺乏 JavaScript 中的回溯功能。我想出的东西:

((([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))....)|
(.(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))...)|
(..(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))..)|
(...(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z])).)|
(....(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z])))

这看起来很长。有没有更好的办法?

我是怎么得出这个结论的:

  1. 字母字符的正则表达式是[a-zA-Z]
  2. 非字母字符的正则表达式是[^a-zA-Z]
  3. 所以我需要找一个[a-zA-Z][^a-zA-Z]左右。[^a-zA-Z][a-zA-Z]
    (([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))
  4. 我需要检查n 个前面的字符和 6- n 个后面的字符。
4

3 回答 3

5
/^(?=.{6})(?=.*[a-zA-Z])(?=.*[^a-zA-Z])/

这表示:

^- 字符串开头
(?= ... )- 后跟(即一个独立的子匹配;它不会移动当前匹配位置)
.{6}- 六个字符(“字符串开头后跟六个字符”实现“必须至少为六个字符长”规则)
.*- 0 个或多个任何字符(换行符除外 - 可能需要解决这个问题?)
[a-zA-Z]- 一个字母(.*[a-zA-Z]因此可以找到任何包含字母的字符串(从技术上讲,它会找到其中的最后一个字母))
[^a-zA-Z]- 一个非字母字符

总结:从字符串的开头开始,我们尝试依次匹配以下每一项:

  • 6 个字符(如果我们找到了,字符串必须是 6 个字符长(或更多))
  • 一个任意字符串,后跟一个字母
  • 一个任意字符串,后跟一个非字母
于 2012-11-28T14:17:17.603 回答
3

使用这个正则表达式...

/^(?=.{6,})(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).*$/
  -------- ------------- --------------
    ^          ^              ^
    |          |              |->checks for a single non-alphabet
    |          |->checks for a single alphabet
    |->checks for 6 to many characters

(?=)检查匹配的前瞻。zero width消耗字符。这就是我们可以背靠背使用多个前瞻的原因

于 2012-11-28T14:17:26.630 回答
0

与其他人类似的答案,因此不需要太多解释,我认为最好的方法是

/^(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).{6,}$/

这从字符串的开头开始,向前看一个字母字符,向前看一个非字母字符,最后找到一个 6+ 字符的字符串,我认为不需要先看长度

于 2012-11-28T14:41:37.410 回答