Perl正则表达式匹配随机字符/数字组合?

时间:2014-01-22 15:42:56

标签: regex perl numbers character

我正在尝试将这些模式与perl regexp匹配:

_b04it4_
_bg4n5p_
_qp9bp_
_hp32z7_

...也就是说,下划线后跟一些字符和数字的组合。 我猜“规则”是两个下划线字符之间存在> = 1 [az]字符和> = 1 [0-9]字符/数字,并且没有空格,“以任意组合混合”。 / p>

并希望用某些东西替换它,例如。 “_X_”。 我很欣赏这方面的一些帮助..我自己的尝试看起来很可怕而且效果不好:)。

5 个答案:

答案 0 :(得分:3)

至少1个字母和数字:

_(?=[^_]*[a-z])(?=[^_]*\d)[a-z\d]+_

RegExr Example

(?=[^_]*[a-z])检查两个_

之间是否存在字母

(?=[^_]*\d)检查两个_

之间的数字是否存在

_[a-z\d]+_执行实际匹配

答案 1 :(得分:2)

怎么样:

_(?=.*[a-z])(?=.*[0-9])[0-9a-z]+_

答案 2 :(得分:1)

没有前瞻的另一种方式:

_([a-z]+[0-9]|[0-9]+[a-z])[a-z0-9]*_

答案 3 :(得分:1)

如果将条件分成多个正则表达式,这样的东西很容易解决。第一个匹配基本约束,第二个匹配确保匹配中至少有1个char和1个数字。

use strict;
use warnings;

while (<DATA>) {
    chomp;
    my $before = my $after = $_;

    $after =~ s{_([a-z0-9]+)_}{
        my $chars = $1;
        # Require 1 digit and 1 letter in the match before replacing.
        ($chars =~ /[a-z]/ && $chars =~ /[0-9]/) ? "_X_" : "_${chars}_"
    }e;

    printf "%-12s -> %-12s\n", $before, $after;
}

__DATA__
_b04it4_
_bg4n5p_
_qp9bp_
_hp32z7_
_nonumbers_
_012345_
_1 space_

答案 4 :(得分:1)

这个怎么样:

use strict;
my ($replacement, @input) = ('X', qw(_b04it4_ _bg4n5p_ _qp9bp_ _hp32z7_));
my @output = map {'_'.$replacement.'_'} grep {/^_[a-z0-9]+_$/ && /[a-z]+/ && /[0-9]+/} @input;
print "$_\n" foreach @output;
相关问题