我正在尝试将这些模式与perl regexp匹配:
_b04it4_
_bg4n5p_
_qp9bp_
_hp32z7_
...也就是说,下划线后跟一些字符和数字的组合。 我猜“规则”是两个下划线字符之间存在> = 1 [az]字符和> = 1 [0-9]字符/数字,并且没有空格,“以任意组合混合”。 / p>
并希望用某些东西替换它,例如。 “_X_”。 我很欣赏这方面的一些帮助..我自己的尝试看起来很可怕而且效果不好:)。
答案 0 :(得分:3)
至少1个字母和数字:
_(?=[^_]*[a-z])(?=[^_]*\d)[a-z\d]+_
(?=[^_]*[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;