我需要在Ruby中验证密码,并要求它们必须包含至少一个字母(/[a-z]{1,}/
)和一个数字(/\d{1,}/
)。但这些可以在字符串中以任何顺序发生。我可以在一个正则表达式中执行此操作吗?
'aa' => should not match
'99' => should not match
'a9' => should match
'9a' => should match
这些不有效:
'9a' =~ /[a-b]{1,}\d{1,}/ <= no match
'a' =~ /[a-b]{1,}|\d{1,}/ <= match
不幸的是我找不到与&
(OR)运算符对应的|
(AND)运算符之类的东西有没有办法做到这一点?
答案 0 :(得分:2)
你可以这样做:
/(?=.*[a-z])(?=.*\d)/
答案 1 :(得分:1)
你可以写:
'9a' =~ /[a-z].*\d|\d.*[a-z]/
但我可能只是咬紧牙关并把它写成两个正则表达式:
'9a' =~ /[a-z]/ && '9a' =~ /\d/
编辑添加:或者,从我对Omar Jackman的回答的评论中,您可以写道:
'9a' =~ /^(?=.*?[a-z]).*?\d/
使用零宽度正向前瞻断言 (?=...)
。
答案 2 :(得分:0)
这适用于所有情况:
([a-zA-Z]+\d+|\d+[a-zA-Z]+)
我还添加了大写字母,因为你没有指定小写字母。