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

Posted

技术标签:

【中文标题】匹配字符串中至少 1 个数字和 1 个字符的正则表达式模式【英文标题】:Regex pattern to match at least 1 number and 1 character in a string 【发布时间】:2011-12-02 20:16:04 【问题描述】:

我有一个正则表达式

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

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

【问题讨论】:

包含特殊字符可以吗? 【参考方案1】:

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

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

【讨论】:

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

这个 RE 会做:

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

RE的解释:

匹配以下任意一项:
    至少一个数字,然后是一个字母 至少一个字母,然后是一个数字
任何剩余的数字和字母 (?:...) 创建一个未引用的组 /iignore-case 标志,因此 a-z == a-zA-Z

【讨论】:

为什么我们需要区分大小写? 末尾的 /i 使其不区分大小写。 在您的代码中,您提到了a-zA-Z。我昨天做了一些测试,推断/[a-z]/i/[a-zA-Z]/ 稍快。见:jsperf.com/regexp-a-z-i-vs-a-za-z @RobW 链接页面上显示的数据与您的声明冲突。在 Chrome 上,/[a-zA-Z]/ 似乎更快。但这无论如何都是一种愚蠢的测试,而且性能一开始并不重要。 如果您想为此添加连字符和下划线检查,您的正则表达式将在字母/数字对之前使用任何连字符或下划线中断。例如:^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9_-]*$abc-d12345【参考方案3】:

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

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

所以,测试一下:-

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

然后这个:-

/\d/

然后这个:-

/[A-Z]/i

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

【讨论】:

我真的很喜欢这种简单性。阅读和维护要容易得多。 你好 Paul.. 我正在寻找一个只有数字 [0-9] 和两个空格字符 [.,] 然后是 'ml' 的正则表达式 - 至少应该有一个数字.. 你的解决方案看起来不错,但我无法编写确切的正则表达式。我试过这个: .match(/(?=.*\d)[0-9][,.]1,5 ml/g) 。它不工作。你能帮帮我吗? 美丽而天才。这应该是公认的答案。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

接受的答案无效,因为不允许输入特殊字符。

它非常适合我。

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

一位必须 一个字符必须(小写或大写) 其他一切可选

谢谢。

【讨论】:

来自问题:the field should accept only alphanumeric values 匹配字符串中至少 1 个数字和 1 个字符的正则表达式模式 表示至少必须是字母数字,但其他所有内容都可以,无论您输入与否。 重读问题。第二行:the field should accept only alphanumeric values 重读第一行:if I insert only number(s) or only character(s) then also it accepts,但他希望两者都必须。所以我觉得我的回答没有错。 他们说他们实际的正则表达式只接受数字或只接受字母,但他们想要至少 1 个数字和 1 个字母 AND 只接受字母数字。公认的答案是 7 年前给出的,它似乎回答得很完美。但是你可以想象你想要什么。祝你有美好的一天。【参考方案6】:

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

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

【讨论】:

【参考方案7】:

可能有点晚了,但这是我的回复:

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

解释:

\w* -> 0 个或多个字母数字,在开头

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

\w* -> 0 个或多个字母数字,再次

希望可以理解

【讨论】:

【参考方案8】:

还有一个带有否定检查的想法。

/^(?!\d*$|[a-z]*$)[a-z\d]+$/i
^(?! 在开始时 look ahead 如果字符串 没有 \d*$ 仅包含数字 |[a-z]*$ 只包含字母 [a-z\d]+$ 匹配一个或多个字母或数字,直到 $ 结束。

Have a look at this regex101 demo

i flag turns on caseless matching: a-z 匹配 a-zA-Z

【讨论】:

【参考方案9】:

如果您需要将数字放在任何单词的末尾,这对我有用:

/\b([a-zA-Z]+[0-9]+)\b/g
\b 字边界 [a-zA-Z] 任意字母 [0-9] 任意数 “+”无限搜索(显示所有结果)

【讨论】:

这与3b1a2b3c4d 不匹配

以上是关于匹配字符串中至少 1 个数字和 1 个字符的正则表达式模式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式的总结

正则表达式datetime

正则表达式

R REGEX匹配-至少1个小写字母,1个数字,并且没有8个长度的特殊字符[重复]

JavaScript-正则表达式

用于密码的javascript正则表达式,包含至少8个字符、1个数字、1个大写和1个小写[重复]