2020-03-19 perl 中正则匹配总结

2020-03-19  本文已影响0人  Bio小盼

一般用法:匹配字符串,变量

$_="yabba dabba doo";
if(/abba/){##默认用它匹配$_中字符串
  print "it matched!\n";##可以匹配,
}
##匹配过程;过程从$_第一字母开始,尝试依次匹配,可以匹配一次即为匹配成功,不在继续进行(局部匹配)
##注意::若果改写为/abb a/ 中间空格也是需要匹配到,if才能返回TRUE

$pattern="(";
if(/$pattern/){
  print "it matched!\n";
}

if(//){
  print "it matched\n";##这样写啥都可以匹配成功
]

通配符

$_="yabba dabba doo!";
if(/doo\N/){ ##写法同if(/doo./)
  print "it matched\n";  ##结果是可以匹配,因为有!的存在
}

量词(重复次数,或者重复操作符)

$_="Bamm-bamm";
if(/Bamm-?bamm/){
    print "it matched\n";##b前面-可有可无
}
$_="Bamm       bamm";
if(/Bamm +bamm/){##b前面至少出现一次空格
    print "it matched\n";
}

$_="yabbbba dabbba doo.";
if(/ab{3}a/){##匹配连续出现三次b,两侧为a,即:dabbba
    print "it matched\n";
}

$_="yabbba dabbba doo.";
if(/ab{2,3}a/){##b至少出现两次,至多出现3次
    print "matched\n";
}
if(/ab{3,}a/)#b至少出现3次,没有上限

小结::

? 前一个字符可有可无
* 前一个字符0次或多次
+ 前一个字符一次以上
{3,} 前一个字符出现至少三次不设上限
{3,5} 前一个字符出现至少三次至多5次

20200324更:

模式分组

#eg1:
$_="abba";
if((.)\1){ ##能匹配bb
  print "matched";
}
##(.)\1 意思为连续出现两个同样的字符

#eg2:
$_="yabba dabba doo";
if(y(....)d\1){ ##匹配到yabba dabba
  print "it matched";
}
if((.)(.)\2\1){ ##匹配镜面重复类eg:abba 其中\2代表匹配第二括号中内容,\1代表匹配第一括号中内容
  print "";
}

#eg3:g{N}写法
$_="aa11bb"; #若果想匹配11前面有一个重复的字符
if((.)\111){##这种写法有歧义,是匹配任意字符11次后面有1,还是匹配任意字符111次??
}
#为正确匹配修改写法为
if((.)\g{1}11){##\g{N}写法含义:N代表原来\后面的数据编号
}
if((.)(.)\g{1}11){#会与上面匹配到相同的内容
}

择一匹配

$_="fred \t \t barney";
if(fred( |\t)+barney){#fred与barney中间存在\t或者空格可以匹配
}

字符集

$_="fred \t \t ba";
if(/fred\s+ba/){
}

锚位

$_="http:www.ablcdeg.com";
if(/\Ahttp*com\z/){##匹配http开头,com结尾
}
#匹配空行:
if(/\A\s*\Z/){
}

单词锚位

用正则表达式进行匹配

$_="i saw bareny\ndown at the bowling alley\n with Fred\nlast night.\n";
if(/bareny.*Fred/s){}
#如果没有\s就不能匹配,因为它们没有在一行
  3. \x:加入辅助空白字符,作用:分割匹配内容,使更易读
/-? [0-9]+ \.? [0-9*]/
  4. 联合使用修饰符:若单次使用多项修饰符,可将其连在一起写在末尾
/barney.*fred/is  

捕获变量

my $_="fred or barney";
if(/(?<name>\w+)  (?:(and|or)) (?<name2>\w+)/x){
  say "i saw $+{name} and $+{name2}";
}

&` '{^MATCH} {^PREMATCH}{^POSTMATCH}

if("hello there,neighbor"=~ /\s(w+),/){
  print "that was ($`)($&)($')";#会拖慢速度
  print "that was (${^PREMATCH})(${MATCH})(${POSTMATCH})"#不会拖慢速度
}
## 匹配内容分别为(hello)( there,)( neighbor)

正则表达式处理文本

my $original="fred ate 1 rib";
(my $cope=$original)=~s/\d+ ribs?/10 ribs/;
my $cope = $original =~s/\d+ ribs?/10 ribs/r;
##上面两种写法均可得到$cope="fred ate 10 ribs";
$_="i saw Barney with Fred";
s/(fred|bareny)/\U$1/gi #得到:i saw BARNEY with FRED
s/(fred|bareny)/\L$1/gi #得到:i saw barney with fred 
s/(\w+) with (\w+)/\U$2\E/i #第二个括号匹配不惊醒大写转换
s/(fred|barney)/\u$1/ig # 变为 BARNEY with Fred
s/(fred|barney)/\u\L$1/ig 
my $a="FRED";
my $b="fRed";
if("\L$a" eq "\L$b"){
  print "it matched";
}
if(s/\(\(\(fred/fred/){}
if(s/\Q((\E(fred/fred/)
#将两个( 转化为本义(,最后一个(不转换为本义

从命令行直接替换文件内容

perl -p -i.bak -w -e "s/Randall/Randal/g" filename
# -p 使perl自动生成一段代码:while(<>){print;}
# i.bak 做备份 不想备份直接-i
# -w 开启警告功能
# -e 会将其后面的内容当做程序代码
my @tmp = ("FRY","LHM","TPJ");
my @con = grep /TPJ|LHM|FRY/i,@tmp;
my $con = @con;
if($con != 0){ 
|___my $aim = "CON::@tmp\n";
|___print "aim:::$aim\n";
}
上一篇 下一篇

猜你喜欢

热点阅读