正则表达式模式匹配至少一个数字和一个字符在一个字符串中。

82

我有一个正则表达式

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

这个正则表达式只允许字母和数字,但如果我输入的是仅数字或仅字符,它也会接受。我希望它的作用是只接受包含至少1个字符和1个数字的字母数字值。


它是否可以包含特殊字符? - Pratik Butani
10个回答

138
为什么不先执行整个测试,然后再添加单独的字符和数字测试呢?无论如何,如果你想在一个正则表达式中完成所有操作,请使用正向前瞻:
为什么不先执行整个测试,然后再添加单独的字符和数字测试呢?无论如何,如果你想在一个正则表达式中完成所有操作,请使用正向前瞻:
/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/

7
这个方案比下面的方案更好:如果你想要添加连字符和下划线检查,这个方案仍然能够完全正常工作。例如:^(?=.*[0-9])(?=.*[a-z])([a-z0-9_-]+)$ abc-d12345 - Sababado
如果我们想要指定字符串的长度,例如11,该怎么办? - Zaveed Abbasi
是的,我确实需要一个正则表达式,它可以验证字符串长度恰好为11,并且至少有一个字符和一个数字。 - Zaveed Abbasi
1
亲爱的 @phihag ,如你所说,在 https://stackoverflow.com/questions/44528450/regex-for-alphanumeric-string-with-at-least-1-number-and-1-character-and-a-fixed 上询问了这个问题。 - Zaveed Abbasi
7
警告:该正则表达式无法处理包含特殊字符的字符串。它只匹配包含字母和数字的字符串,而不能匹配包含字母、数字和特殊字符的字符串。 - Judah Gabriel Himango
显示剩余6条评论

24

这个正则表达式可以实现:

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

RE的解释:

  • 匹配以下任一条件:
    1. 至少一个数字,然后是一个字母 或者
    2. 至少一个字母,然后是一个数字 加上
  • 匹配所有剩余的数字和字母

  • (?:...) 创建一个未被引用的组
  • /i忽略大小写 标记,这样 a-z == a-zA-Z

为什么我们需要在这里区分大小写? - OM The Eternity
在结尾处的 /i 使其不区分大小写。 - Kasaku
在你的代码中,你提到了 a-zA-Z。我昨天进行了一些测试,并得出结论,/[a-z]/i/[a-zA-Z]/ 稍微快一点。参见:http://jsperf.com/regexp-a-z-i-vs-a-za-z - Rob W
3
链接页面上展示的数据与您的陈述相矛盾。在Chrome浏览器中,/[a-zA-Z]/似乎更快。但那是一个有点愚蠢的测试,性能并不重要。 - phihag
如果你想要在这个正则表达式中添加对连字符和下划线的检查,你的正则表达式将会在任何字母/数字对前面有连字符或下划线时失效。例如:^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9_-]*$abc-d12345 - Sababado
这是最佳解决方案,因为它只需要搜索一次字符串。其他答案中建议的多个前瞻和多个正则表达式需要多次遍历字符串中的每个字符。 - Nathan K

23

我看到其他答复者已经给出了完整的解决方案。正则表达式的问题在于它们很难维护/理解。

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

因此,测试这个:

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

那么这样做:

/\d/

那么就是这样:

/[A-Z]/i
如果你的字符串通过了这三个正则表达式,那么你就得到了你需要的答案。

我真的很喜欢这个简洁明了的风格。阅读和维护起来都要容易得多。 - Josh Harrison
你好,Paul。我正在寻找一个只包含数字[0-9]和两个特殊字符[.,]的正则表达式,然后是“ml”——至少应该有一个数字。你的解决方案看起来很棒,但我无法编写精确的正则表达式。我尝试了这个:.match(/(?=.*\d)[0-9][,.]{1,5} ml/g),但它不起作用。你能帮我吗? - Sanket Tarodekar
美丽而聪明。这应该是被接受的答案。 - Ilker Cat

14

已被接受的答案无法正常工作,因为它不允许输入特殊字符。

这对我来说完美地起作用了。

^(?=.*[0-9])(?=.*[a-zA-Z])(?=\S+$).{6,20}$

  • 必须有一个数字
  • 必须有一个字符(小写或大写)
  • 其他内容均为可选项

谢谢。


从问题来看:该字段应仅接受字母数字值 - Toto
“Regex模式匹配字符串中至少包含1个数字和1个字符”意味着必须至少包含一个字母数字,其他任何内容都可以选择输入或不输入。 - Pratik Butani
重新阅读问题。第二行:该字段应仅接受字母数字值。 - Toto
重新阅读第一行:“如果我只插入数字或只插入字符,它也会接受”,但他希望两者都必须。因此,我认为我的答案不是错误的。 - Pratik Butani
他们说他们的实际正则表达式只接受数字或字母,但他们想要至少1个数字和1个字母并且仅限字母数字。 接受的答案是7年前给出的,似乎完美地回答了这个问题。但你可以自由想象。祝你有愉快的一天。 - Toto

10

虽然被认为是正确的答案,但我发现这个正则表达式更容易阅读:

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

7

此解决方案至少接受1个数字和1个字符:

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

4

3
也许有点晚了,但这是我的 RE: /^(\w*(\d+[a-zA-Z]|[a-zA-Z]+\d)\w*)+$/ 解释: \w* -> 0 或多个字母数字字符,在开头 \d+[a-zA-Z]|[a-zA-Z]+\d -> 数字 + 字母 OR 字母 + 数字 \w* -> 再次出现 0 或多个字母数字字符
我希望这样更容易理解。

1
那么简单地说,怎么样:
/[0-9][a-zA-Z]|[a-zA-Z][0-9]/

对我来说,它的工作效果很好...

编辑以下评论:

嗯,在深夜时有些短视:对不便之处表示歉意...

不完整的基本想法是,只需要在某个地方从数字到字母或从字母到数字的“转换”才能回答问题。

但下一个正则表达式应该适用于仅由字母数字字符组成的字符串:

/^[0-9a-zA-Z]*([0-9][a-zA-Z]|[a-zA-Z][0-9])[0-9a-zA-Z]*$/

在JavaScript中,可以进一步简化为:

/^[0-9a-z]*([0-9][a-z]|[a-z][0-9])[0-9a-z]*$/i

在我看来,这个答案比其他一些答案更加直观易懂(没有回溯等操作)。

希望这可以帮到你。


我错过了开头的 ^ 和结尾的 $!你必须确保只有字母数字字符。但是这样还是不行。 - Andy A.
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

-1
如果您需要数字位于任何单词的末尾,这个方法对我很有效:
/\b([a-zA-Z]+[0-9]+)\b/g
  • \b 单词边界
  • [a-zA-Z] 任何字母
  • [0-9] 任何数字
  • "+" 无限搜索(显示所有结果)

这与 3b1a2b3c4d 不匹配。 - Toto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接