正则expression式的字母数字,至less有1个数字和1个字符

我有一个正则expression式

/ ^([A-ZA-Z0-9] +)$ /

这只允许字母数字,但如果我只插入数字或字符(S),然后也接受它。 我希望它的工作,如字段应该只接受字母数字值,但该值必须至less包含1个字符和1个数字。

为什么不首先应用整个testing,然后添加个性testing的字符和数字? 无论如何,如果你想在一个正则expression式中完成这一切,请使用积极的向前看:

/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/ 

这RE会做:

 /^(?:[0-9]+[az]|[az]+[0-9])[a-z0-9]*$/i 

RE的解释:

  • 符合以下任一条件:
    1. 至less有一个数字,然后是一个字母
    2. 至less有一个字母,然后是一个数字加上
  • 任何剩余的数字和字母
  • (?:...)创build一个未被引用的组
  • /i忽略情况标志,所以az == a-zA-Z

我可以看到其他响应者已经给你一个完整的解决scheme。 正则expression式的问题在于难以维护/理解。

更简单的解决scheme是保留现有的正则expression式,然后创build两个新的正则expression式来testing“至less一个字母”和“至less一个数字”。

所以,testing这个:

 /^([a-zA-Z0-9]+)$/ 

那么这个:

 /\d/ 

那么这个:

 /[AZ]/i 

如果你的string通过了所有三个正则expression式,你就有了你需要的答案。

该解决scheme接受至less1个数字和至less1个字符:

 [^\w\d]*(([0-9]+.*[A-Za-z]+.*)|[A-Za-z]+.*([0-9]+.*)) 

也许有点晚,但这是我的RE:

/^(\w*(\d+[a-zA-Z]|[a-zA-Z]+\d)\w*)+$/

说明:

\w* – > 0或更多的字母数字,在开头

\d+[a-zA-Z]|[a-zA-Z]+\d – >一个数字+一个字母或一个字母+一个数字

\w* – > 0或更多的字母数字,再次

我希望这是可以理解的

虽然接受的答案是正确的,我发现这个正则expression式更容易阅读:

 REGEX = "([A-Za-z]+[0-9]|[0-9]+[A-Za-z])[A-Za-z0-9]*" 

而一个负面检查的想法。

 /^(?!\d*$|[az]*$)[az\d]+$/i 
  • ^(?!开始前瞻如果string没有
  • \d*$只包含数字| 要么
  • [az]*$只包含字母
  • [az\d]+$匹配一个或多个字母或数字,直到$结束。

看看这个regex101演示

i标志打开无匹配匹配 : az匹配a-zA-Z