2011-10-07 50 views
35

字母数字我有一个正则表达式正则表达式,用于与至少1号和1个字符

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

这只是仅允许字母数字,而且,如果我只插入数(S)或唯一的字符( s),那么它也接受它。我希望它能够像字段只应接受字母数字值一样工作,但该值必须至少包含1个字符和1个数字。

回答

62

为什么不先应用整个测试,然后为字符和数字添加单独的测试?无论如何,如果你想要做的这一切在一个正则表达式,使用正前瞻:

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

这比下面的解决方案更好:如果你想添加一个连字符和下划线检查,这将仍然工作。例:'^(?=。* [0-9])(?=。* [az])([a-z0-9 _-] +)$'abc-d12345 – Sababado

+1

非常感谢回答和解释想法 – merveotesi

+0

@Sababado感谢_ - 解决方案:-) – Rahi

16

这RE会做:

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

RE的说明:

  • 匹配以下任一操作:
    1. 至少有一个号码,然后一个字母
    2. 至少一个字母,然后一个数字
  • 任何剩余的数字和字母

  • (?:...)创建未引用的组
  • /i忽略情况标志,以便a-z == a-zA-Z
+0

为什么我们需要在这种情况下的灵敏度? –

+0

/i最后会使其不区分大小写。 – Kasaku

+0

在你的代码中,你提到了'a-zA-Z'。我昨天做了一些测试,并推断'/ [a-z]/i'比'/ [a-zA-Z] /'稍快。请参阅:http://jsperf.com/regexp-a-z-i-vs-a-za-z –

13

我可以看到其他的反应已经给你一个完整的解决方案。正则表达式的问题是它们可能难以维护/理解。

更简单的解决方案是保留现有的正则表达式,然后创建两个新的正则表达式来测试“至少一个字母”和“至少一个数字”。

因此,本次测试: -

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

那么这样的: -

/\d/ 

那么这样的: -

/[A-Z]/i 

如果字符串通过全部三个正则表达式,你有你需要的答案。

+0

我真的很喜欢这个简单。更容易阅读和维护。 –

2

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

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

说明:

\w* - > 0个或多个字母数字,一开始

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

\w* - > 0以上的字母数字,再次

我希望这是可以理解的

3

该解决方案接受至少1号和至少1个字符:

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

虽然接受的答案是正确的,我觉得这是正则表达式很容易阅读:

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