将正则表达式语句组合在一起

时间:2016-09-17 22:20:11

标签: regex

我正在尝试将这些正则表达式合并为一个。有谁知道这是否可能?

基本上我正在尝试检查字符串是否包含小写字母,大写字母和数字。

(.*[a-z]+.*)
(.*[A-Z]+.*)
(.*[0-9]+.*)

所以这些字符串都会传递

aA1
a1A
Aa1
A1a
1aA
1Aa

返回false的示例

aa1
AA1
a1a
AAa
a1
1a
1AA
1A
etc..

2 个答案:

答案 0 :(得分:1)

是的,但它很讨厌。 (例子在Perl中)

my $re = qr{(?:
    ([a-z]+) |
    ([A-Z]+) |
    ([0-9]+)
)+}x;

必须定义所有$1$2$3(因为0为假,所以我们不会将其删除)。

$string =~ $re;
print "Match" if defined $1 && defined $2 && defined $3;

为了每个人的利益,你最好将它保存在三个简单的正则表达式并编写一个子程序。

sub is_valid_string {
    my $str = shift;

    return 0 unless $str =~ /[a-z]/;
    return 0 unless $str =~ /[A-Z]/;
    return 0 unless $str =~ /[0-9]/;

    return 1;
}

答案 1 :(得分:1)

一种非常简单的方法是枚举所有六种组合:

[a-z][A-Z][0-9]|[a-z][0-9][A-Z]|[A-Z][a-z][0-9]|[A-Z][0-9][a-z]|[0-9][a-z][A-Z]|[0-9][A-Z][a-z]

基本上,你有三种类型的角色 - U pper, L ower, D igit。这六种组合是

LUD|LDU|ULD|UDL|DLU|DUL

正如您所看到的,这很快变得复杂。如果你是密码检查,那么用宿主语言进行字符类计数是一个更好的选择。