【发布时间】:2011-10-07 08:36:19
【问题描述】:
我有一个正则表达式
/^([a-zA-Z0-9]+)$/
这只允许字母数字,但如果我只插入数字或只插入字符,那么它也接受它。我希望它像字段一样工作,应该只接受字母数字值,但该值必须至少包含 1 个字符和 1 个数字。
【问题讨论】:
-
包含特殊字符可以吗?
标签: javascript regex validation
我有一个正则表达式
/^([a-zA-Z0-9]+)$/
这只允许字母数字,但如果我只插入数字或只插入字符,那么它也接受它。我希望它像字段一样工作,应该只接受字母数字值,但该值必须至少包含 1 个字符和 1 个数字。
【问题讨论】:
标签: javascript regex validation
为什么不先应用整个测试,然后为字符和数字添加单独的测试?无论如何,如果您想在一个正则表达式中完成所有操作,请使用积极的前瞻:
/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/
【讨论】:
^(?=.*[0-9])(?=.*[a-z])([a-z0-9_-]+)$abc-d12345
这个 RE 会做:
/^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9]*$/i
RE的解释:
(?:...) 创建一个未引用的组/i 是 ignore-case 标志,因此 a-z == a-zA-Z。【讨论】:
a-zA-Z。我昨天做了一些测试,推断/[a-z]/i 比/[a-zA-Z]/ 稍快。见:jsperf.com/regexp-a-z-i-vs-a-za-z
/[a-zA-Z]/ 似乎更快。但这无论如何都是一种愚蠢的测试,而且性能首先并不重要。
^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9_-]*$abc-d12345
我可以看到其他响应者已经为您提供了完整的解决方案。正则表达式的问题在于它们可能难以维护/理解。
一个更简单的解决方案是保留您现有的正则表达式,然后创建两个新的正则表达式来测试您的“至少一个字母”和“至少一个数字”。
所以,测试一下:-
/^([a-zA-Z0-9]+)$/
然后这个:-
/\d/
然后这个:-
/[A-Z]/i
如果你的字符串通过了所有三个正则表达式,你就有了你需要的答案。
【讨论】:
虽然接受的答案是正确的,但我发现这个正则表达式更容易阅读:
REGEX = "([A-Za-z]+[0-9]|[0-9]+[A-Za-z])[A-Za-z0-9]*"
【讨论】:
接受的答案无效,因为不允许输入特殊字符。
它非常适合我。
^(?=.*[0-9])(?=.*[a-zA-Z])(?=\S+$).{6,20}$
谢谢。
【讨论】:
the field should accept only alphanumeric values
the field should accept only alphanumeric values
if I insert only number(s) or only character(s) then also it accepts,但他希望两者都必须。所以我觉得我的回答没有错。
此解决方案接受至少 1 个数字和至少 1 个字符:
[^\w\d]*(([0-9]+.*[A-Za-z]+.*)|[A-Za-z]+.*([0-9]+.*))
【讨论】:
可能有点晚了,但这是我的回复:
/^(\w*(\d+[a-zA-Z]|[a-zA-Z]+\d)\w*)+$/
解释:
\w* -> 0 个或多个字母数字,在开头
\d+[a-zA-Z]|[a-zA-Z]+\d -> 一个数字 + 一个字母或一个字母 + 一个数字
\w* -> 0 个或多个字母数字,再次
希望可以理解
【讨论】:
还有一个带有否定检查的想法。
/^(?!\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)
【讨论】:
如果您需要将数字放在任何单词的末尾,这对我有用:
/\b([a-zA-Z]+[0-9]+)\b/g
【讨论】:
3b 或 1a2b3c4d 不匹配