如何编写与任何顺序的两个模式匹配的正则表达式?

时间:2012-09-19 16:27:21

标签: ruby regex

我需要在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)运算符之类的东西有没有办法做到这一点?

3 个答案:

答案 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]+)

我还添加了大写字母,因为你没有指定小写字母。