匹配字符串中至少 1 个数字和 1 个字符的正则表达式模式

IT技术 javascript regex validation
2021-01-13 16:11:18

我有一个正则表达式

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

这只允许只输入字母数字,但如果我只插入数字或只插入字符,那么它也接受它。我希望它像该字段应该只接受字母数字值一样工作,但该值必须至少包含 1 个字符和 1 个数字。

6个回答

为什么不先应用整个测试,然后为字符和数字添加单独的测试?无论如何,如果您想在一个正则表达式中完成所有操作,请使用正向预测:

/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/
这比以下解决方案更好:如果您想添加连字符和下划线检查,这仍然可以正常工作。例如:^(?=.*[0-9])(?=.*[a-z])([a-z0-9_-]+)$abc-d12345
2021-03-12 16:11:18
非常感谢您对思考方式的回答和解释
2021-03-28 16:11:18
亲爱的@phihag ,正如你所说的,在stackoverflow.com/questions/44528450/...
2021-04-05 16:11:18
警告:此正则表达式将在包含特殊字符的字符串上失败。它只匹配包含字母和数字的字符串。它不包含包含字母、数字和特殊字符的字符串。
2021-04-07 16:11:18
这很好地解释了环视的工作原理: regular-expressions.info/lookaround.html
2021-04-10 16:11:18

此 RE 将执行以下操作:

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

RE的解释:

  • 匹配以下任意一项:
    1. 至少一个数字,然后是一个字母
    2. 至少一个字母,然后一个数字
  • 任何剩余的数字和字母

  • (?:...) 创建一个未引用的组
  • /i忽略大小写标志,所以a-z== a-zA-Z
在您的代码中,您提到了a-zA-Z. 我昨天做了一些测试,并推断出/[a-z]/i/[a-zA-Z]/. 请参阅:jsperf.com/regexp-azi-vs-a-za-z
2021-03-11 16:11:18
如果您想为此添加对连字符和下划线的检查,您的正则表达式将在字母/数字对之前与任何连字符或下划线断开。例如:^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9_-]*$abc-d12345
2021-03-11 16:11:18
为什么我们需要区分大小写?
2021-03-31 16:11:18
最后的 /i 使其不区分大小写。
2021-04-03 16:11:18
@RobW 链接页面上显示的数据与您的陈述冲突。在 Chrome 上,/[a-zA-Z]/似乎更快。但这无论如何都是一种愚蠢的测试,而且性能一开始并不重要。
2021-04-04 16:11:18

我可以看到其他响应者已经为您提供了完整的解决方案。正则表达式的问题在于它们可能难以维护/理解。

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

因此,对此进行测试:-

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

然后这个:-

/\d/

然后这个:-

/[A-Z]/i

如果您的字符串通过了所有三个正则表达式,您就有了所需的答案。

我真的很喜欢这种简单性。更容易阅读和维护。
2021-03-28 16:11:18
你好 Paul.. 我正在寻找一个只有数字 [0-9] 和两个空格字符 [.,] 的正则表达式,然后是“ml”——至少应该有一个数字......你的解决方案看起来不错,但我不能写出确切的正则表达式。我试过这个: .match(/(?=.*\d)[0-9][,.]{1,5} ml/g) 。它不工作。你能帮我吗。
2021-04-06 16:11:18
美丽而天才。这应该是公认的答案。
2021-04-10 16:11:18

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

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

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

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