匹配字符串中至少 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的解释:
匹配以下任意一项:-
至少一个数字,然后是一个字母或
至少一个字母,然后是一个数字加
(?:...)
创建一个未引用的组
/i
是 ignore-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] 任意数
“+”无限搜索(显示所有结果)
【讨论】:
这与3b
或1a2b3c4d
不匹配以上是关于匹配字符串中至少 1 个数字和 1 个字符的正则表达式模式的主要内容,如果未能解决你的问题,请参考以下文章