我有正则表达式
/^([a-zA-Z0-9]+)$/
这只允许使用字母数字,但如果我只插入数字或只插入字符,那么它也会接受它。我希望它工作,因为字段应该只接受字母数字值,但该值必须至少包含1个字符和1个数字。
答案 0 :(得分:82)
为什么不首先应用整个测试,然后为字符和数字添加单独的测试?无论如何,如果你想在一个正则表达式中完成所有操作,请使用正向前瞻:
/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/
答案 1 :(得分:17)
这个RE会做:
/^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9]*$/i
RE的解释:
(?:...)
创建一个未引用的群组/i
是 ignore-case 标志,因此a-z
== a-zA-Z
。答案 2 :(得分:14)
我可以看到其他响应者给了你一个完整的解决方案。正则表达式的问题在于它们难以维护/理解。
更简单的解决方案是保留现有的正则表达式,然后创建两个新的正则表达式来测试“至少一个字母”和“至少一个数字”。
所以,测试一下: -
/^([a-zA-Z0-9]+)$/
然后: -
/\d/
然后: -
/[A-Z]/i
如果你的字符串通过所有三个正则表达式,你就得到了你需要的答案。
答案 3 :(得分:5)
虽然接受的答案是正确的,但我发现这个正则表达式更容易阅读:
REGEX = "([A-Za-z]+[0-9]|[0-9]+[A-Za-z])[A-Za-z0-9]*"
答案 4 :(得分:4)
此解决方案接受至少1个数字且至少包含1个字符:
[^\w\d]*(([0-9]+.*[A-Za-z]+.*)|[A-Za-z]+.*([0-9]+.*))
答案 5 :(得分:3)
也许有点晚了,但这是我的RE:
/^(\w*(\d+[a-zA-Z]|[a-zA-Z]+\d)\w*)+$/
说明:
\w*
- >开头的0个或更多字母数字数字
\d+[a-zA-Z]|[a-zA-Z]+\d
- >数字+字母或字母+数字
\w*
- > 0个或更多字母数字,再次
我希望这是可以理解的
答案 6 :(得分:2)
带负面检查的想法。
/^(?!\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
)
答案 7 :(得分:0)
无法接受接受的答案,因为不允许输入特殊字符。
它对我来说很完美。
^(?=.*[0-9])(?=.*[a-zA-Z])(?=\S+$).{6,20}$
谢谢。
答案 8 :(得分:0)
如果您需要将数字放在任何单词的末尾,这对我有用:
/\b([a-zA-Z]+[0-9]+)\b/g