正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
对于刚刚接触它的同学来说,略不友好,其语法、各种各样的灵活组合,看起来有点像天书。如下举例:
(?!(.*_PADCAL_MASK|.*HBM_MISR_MASK|.*POWER_CTL_MASK|.*RG_CTL_MASK))(.*MASK.*)
有点懵逼,是吧。淡定,我选择了一个复杂度较高的例子。大部分日常使用的正则表达式并没有这么复杂。
强烈推荐下面这个免费的regex tester:它提供了online的regex测试、解析,并且例举了全部的可用语法元素。当我碰到不确定的正则表达式 (regex),我就会来这里去验证。
https://regex101.com/
既然regex是用来做文本操作,那么我们先设置一个sample text
# 在Perl中定义一个这样数组,4个元素
my @path_arr = (
'/home/scratch.john_gpu/gv100',
'/home/scratch.mike_gpu/ga100',
'/home/scratch.mike_gpu/lr10',
'/home/scratch.ema_ate/regression'
);
foreach my $elem (@path_arr) {
# foreach大家还记得吧
if ($elem =~ /_gpu/ ) {
print "$elem \n";
}
}
#结果是:
/home/scratch.john_gpu/gv100
/home/scratch.mike_gpu/ga100
/home/scratch.mike_gpu/lr10
foreach my $elem (@path_arr) {
if ($elem =~ /_gpu\/ga100/ ) {
print "$elem \n";
}
}
#结果是:
/home/scratch.mike_gpu/ga100
foreach my $elem (@path_arr) {
if ($elem =~ /mike.*ga100/ ) {
print "$elem \n";
}
}
#结果是:
/home/scratch.mike_gpu/ga100
foreach my $elem (@path_arr) {
if ($elem =~ /(g\w100)/ ) {
print "$1 \n";
}
}
#结果是:
ga100
gv100
2,$3 ... 存储了每个括号中的匹配字段。
foreach my $elem (@path_arr) {
$elem =~ s/g\w100/lr10/ ;
print "$elem \n" ;
}
#结果是:
/home/scratch.john_gpu/lr10
/home/scratch.mike_gpu/lr10
/home/scratch.mike_gpu/lr10 # 这个出现意外不
/home/scratch.ema_ate/regression # 这个出现意外不
foreach my $elem (@path_arr) {
if ($elem =~ /g\w100/) {
$elem =~ s/(g\w100)/\U$1\E/ ;
print $elem, "\n" ;
}
}
#结果是:
/home/scratch.john_gpu/GV100
/home/scratch.mike_gpu/GA100
这样的代码很常见:传递过来一个变量A,我想对A中的字符串内容进行一些操作(比如替换),但我又不想更改A的内容,那么:
my $A = 'my name is jason' ;
(my $B = $A) =~ s/jason/emma/;
print "A = $A \n";
print "B = $B \n";
#结果是:
A = my name is jason
B = my name is emma
本篇内容重在抛砖引玉(cover的内容其实很浅),我墙裂建议学习regex的时候,将更多的尝试和验证放在online regex tester上,实践出真知嘛。