加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl基础知识07【正则表达式】

发布时间:2020-12-16 00:10:45 所属栏目:大数据 来源:网络整理
导读:本页涉及到2块内容 1.模式匹配 ?? 1.1修饰符 ?? 1.2__DATA__文件句柄 ?? 1.3m匹配符,s替换运算符,=~匹配运算符 ?? 1.4保存模式的特殊变量 2.元字符 ?? 2.1.点号"."与换行符与s修饰符关系 ?? 2.2.理解【】的意思 ?? 2.3.贪婪与非贪婪 ?? 2.4.锚定字符 ?? 2.

本页涉及到2块内容

1.模式匹配

?? 1.1修饰符

?? 1.2__DATA__文件句柄

?? 1.3m匹配符,s替换运算符,=~匹配运算符

?? 1.4保存模式的特殊变量

2.元字符

?? 2.1.点号"."与换行符与s修饰符关系

?? 2.2.理解【】的意思

?? 2.3.贪婪与非贪婪

?? 2.4.锚定字符

?? 2.5.匹配交替性

?? 2.6.分组分簇

?? 2.7.记忆与捕获($1,$2..)

?? 2.8.正向前负向前的匹配替换

?? 2.9.tr函数

?? 2.10.单双引号的使用场景


-------------------------------------------------------------------------------------------------------------------------------------------------------


-->正则表达式功能很强大,也比较要区级时间去小结,用好它,它可以帮你做很多事情,让你:)哈哈;

答1.1修饰符

-->请列出你所知道的修饰符?

:)if???? :)while???? :)? foreach??? :)? unless??? :) until


#if

[oracle@localhost ~]$ perl -ne'
> print if m(03/20/13);
> ' data
03/20/13



#while

[oracle@localhost ~]$ perl -e'
$a=8;
print $a-- while $a>0;
'
87654321[oracle@localhost ~]$ perl -e'
$a=8;
print $a--,while $a>0;???????? #这边在$a--后加个“,”也不影响结果;
'
87654321



#foreach

[oracle@localhost ~]$ perl -e'
@arr=("aan","bbn","ccn","n");
print foreach(@arr);? ?
'
aa
bb
cc


#unless

[oracle@localhost ~]$ perl -e'
> $a=8;
> print $a unless $a==5;
> '
8


#until

[oracle@localhost ~]$ perl -e'
$a=8;
print $a--,until $a==0;
'
87654321


答1.2(文件句柄)

-->这个比较简单就是嵌在脚本中的文本段

[oracle@localhost ~]$ ./perl07
one
two
three
[oracle@localhost ~]$ cat perl07
#!/usr/bin/perl
while(<DATA>){????? ?
print;????? ?
}
__DATA__
one
two
three

PS:不知道为啥在perl -e' '中扩行没有结果输出?



答1.3

#m匹配,这个在搜索内容带有/方便,m后面的要求配对符号只要不为字母即可,如' '," ",{ }

[oracle@localhost ~]$ cat data
zhang ddcabccc? okjj aagabcdeff
03/15/09
03/13/25
03/20/13

[oracle@localhost ~]$ perl -ne'
print if m(03/20/13);
' data
03/20/13

当然它还有几个选项要记住的,igx选项用得会多些;


-x的选项用得少些

[oracle@localhost ~]$ perl -ne'
> print if /03/20/13 #this is comment/x;
> ' data
03/20/13


#s替换运算符,有几个选项,用得比较多的是eigx,除e外其它与上面的几个选项类似;



#-e参数是比较少用的,从下面对比中可以看到它的用法;

[oracle@localhost ~]$ perl -ne'
> print if s/15/15*3/e;
> ' data
03/45/09
[oracle@localhost ~]$ perl -ne'
print if s/15/15*3/;
' data
03/15*3/09


#绑定模式运算符

这个运算符一个是在默认的处理变量不为$_时,平时我们的写法是类似

print if /.../;

而当不为默认的$_时,我们就要指明绑定匹配符;

[oracle@localhost ~]$ cat perl07
#!/usr/bin/perl
while($inputline=<DATA>){????? ?
print $inputline if $inputline =~ /on/;????? ?
}
__DATA__
one
two
three

#从上面可以看到$_--->$inputline;


答1.4-保存模式的特殊变量

这里涉及到3个变量$&,$`,$';后2个一个是反引,一个是单引;

$&:表示是上一个匹配模式中查找的内容;

$`:上一次查找匹配模式内容的前面的内容;

$':上一次查找匹配模式内容的后面的内容;

[oracle@localhost ~]$ ./perl07 ?
okjj
zhang ddcabccc ?
aagabcdeff
[oracle@localhost ~]$ cat perl07
#!/usr/bin/perl
$_='zhang ddcabccc? okjj aagabcdeff';
/okjj/;
print $&,"n";
/okjj/;
print $`,"n";
/okjjs/;
print $',"n";



答2.元字符

包含内容:

2.1.点号"."与换行符与s修饰符关系

2.2.理解【】的意思

2.3.贪婪与非贪婪

2.4.锚定字符

2.5.匹配交替性

2.6.分组分簇

2.7.记忆与捕获($1,$2..)

2.8.正向前负向前的匹配替换

2.9.tr函数

2.10.单双引号的使用场景

-------------------------------------------------------------------------------

答2.12.1.点号"."与换行符与s修饰符关系

可以看到加了s修饰符会把n当作是一个点号"."能匹配到的字符;

如果没有加“s”修饰符那么n将会执行换行;

[oracle@localhost ~]$ perl -e'
> $a="zhang baonkun";
> $a =~ s/.*/ha/ig;
> print $a;
> '
haha? #这里执行了换行
haha[oracle@localhost ~]$ perl -e'
$a="zhang baonkun";
$a =~ s/.*/ha/s;
print $a;
'
ha

-------------------------------------------------------------------------------


答2.2.理解【】的意思

看个例子:if /[A-Za-z0-9_]/; #知道这个代表是什么?

zhang?

2342

zhang 2342

zhang ___

_ _ _ _

结果是上面的行都符合,它代表是含有“大写字母or小写字母or数字or下划线"_"

-------------------------------------------------------------------------------

答2.3.贪婪与非贪婪,可以看到非贪婪就是按最小的匹配原则,贪婪就是按最大的匹配原则;

#贪婪与非贪婪的区别例子
(The Script)
# Greedy and not greedy
1 $_="abcdefghijklmnopqrstuvwxyz";
2 s/[a-z]+/XXX/;
3 print $_,"n";
4 $_="abcdefghijklmnopqrstuvwxyz";
5 s/[a-z]+?/XXX/;
6 print $_,"n";
(Output)
3 XXX
6 XXXbcdefghijklmnopqrstuvwxyz


答:2.4.锚定字符

这里我们只关注难理解,常见开头结尾(^,$)就忽略不讲;

从测试结果来看^,$,A,Z,z几个关于首尾的使用上没什么不同,待日后再确定?


#看下G意思

下面这段摘抄于官档

Here's how to use m//gc withG:

 
 
  1. $_ = "ppooqppqq";
  2. while ($i++ < 2) {
  3. print "1: '";
  4. print $1 while /(o)/gc; print "',pos=", pos, "n";
  5. print "2: '";
  6. print $1 if /G(q)/gc; print "', "n";
  7. print "3: '";
  8. print $1 while /(p)/gc; print "', "n";
  9. }
  10. print "Final: '$1',pos,"n" if /G(.)/;

The last example should print:

 
 
  1. 1: 'oo',pos=4
  2. 2: 'q',pos=5
  3. 3: 'pp',pos=7
  4. 1: '',pos=7
  5. 2: 'q',pos=8
  6. 3: '',pos=8 #位置已经到结尾,加了/c参数位置不会被重置从0开始
  7. Final: 'q',pos=8 /G(.)/这个匹配的就是结尾'q'的最后一次匹配的位置
#至于pos是一个变量,可以查阅官档;

http://perldoc.perl.org/functions/pos.html

#b和B

[oracle@localhost ~]$ perl -ne'
print if /b555b/;
' data
bao 555
555 8
[oracle@localhost ~]$ cat data
zhang 5555 66
bao 555
555 8

#b边界包括旁边为空格或者在行首或行尾的情况,行首和行尾有一侧是没有空格的;

#B与b是相反,这里不举例说明;


答2.5.匹配交替性

#这个比较简单

[oracle@localhost ~]$ cat data
zhang 5555 66
bao 555
555 8
[oracle@localhost ~]$ perl -ne'
> print if /66|8/;
> ' data
zhang 5555 66
555 8

#相当于是grep -E这个参数的作用;

答2.6.分组分簇

# 这个也比较简单,无非是将要匹配的字符放在一起用|隔开用括号括起的小模式结构;

[oracle@localhost ~]$ cat data
zhao 5555 66
bao 555
555 8
[oracle@localhost ~]$ perl -ne'
> print if /(zh|b)ao/;
> ' data
zhao 5555 66
bao 555

答2.7.记忆与捕获($1,$2..)

#这个比较常用,而且也比较有用;

#先看个例子在行的前后增加“|”;

[oracle@localhost ~]$ cat data
zhao 5555 66
bao 555
555 8
[oracle@localhost ~]$ perl -ne'
> $_ =~ s/(.*)/|$1|/;????? #这边的$就是记忆捕获前面第一个括号的(.*)匹配的字符,这个匹配字符就是整行;
> print;
> ' data
|zhao 5555 66|
|bao 555|
|555 8|


再看另一例子

[oracle@localhost ~]$ cat data
zhao 5555 66
bao 555
555 8


[oracle@localhost ~]$ perl -ne'
$_ =~ /(.*)s(w+)/;??????? #第一个括号对应$1,第二个对应$2;
print $1,"---",$2,"n";
' data
zhao 5555---66
bao---555
555---8


答2.8.正向前负向前的匹配替换


这个也是简单的,只要记住下符号即行;

概括:没有!意思就是指不匹配的结构称作“负”,有就是指匹配结构称作“正”;

向前与向后是针对所查找的小括号的内的字符的位置而言,放前面的匹配查找就是“正向前查找”;

[oracle@localhost ~]$ perl -ne'
$_ =~? s/ren(?= min)/888/;
print $_;' data
zhang hua 888 min ren

[oracle@localhost ~]$
[oracle@localhost ~]$ cat data
zhang hua ren min ren


[oracle@localhost ~]$ cat data
zhang hua ren min ren

[oracle@localhost ~]$ perl -ne'
$_ =~? s/ren(?! min)/888/;
print $_;' data
zhang hua ren min 888


[oracle@localhost ~]$ perl -ne'
$_ =~? s/(?<= min) ren/ 888/g;? #注意ren前面有一个空格!
print $_;' data
zhang hua min 888 min 888

[oracle@localhost ~]$ cat data
zhang hua min ren min ren


[oracle@localhost ~]$ cat data
zhang hua min ren min ren ren
zhang hua ren

[oracle@localhost ~]$ perl -ne'
$_ =~? s/(?<! min) ren/ 888/g;
print $_;' data
zhang hua min ren min ren 888
zhang hua 888


答:2.9.tr函数

这个用得少一些,将三个选项举例:

#/d/选项前面搜索的字符是或的关系而不是完全匹配,看下面的变化就清楚了;

[oracle@localhost ~]$ perl -ne'
$_ =~ tr/z//d;?? ?
print;
' data
hang hua min ren min ren ren
hang hua ren

[oracle@localhost ~]$ perl -ne'
$_ =~ tr/zh//d;
print;
' data
ang ua min ren min ren ren
ang ua ren

[oracle@localhost ~]$ perl -ne'
$_ =~ tr/zha//d;
print;
' data
ng u min ren min ren ren
ng u ren

[oracle@localhost ~]$ perl -ne'
$_ =~ tr/zhan//d;???????????? #也就是包含有z或h或a或n的字符全部删除;
print;
' data
g u mi re mi re re
g u re


#/c选项意思

[oracle@localhost ~]$ perl -ne'
$_ =~ tr/zhang/*/c;
print;
' data
zhang*h*a***n***n***n***n***n*zhang*h*a***n**[oracle@localhost ~]$

#跟上面的匹配关系是相反的;

也就是对于上面这个例子对于不包含z或h或a或n或g的字符用*替换包含替代掉"n";


#/s选项意思

[oracle@localhost ~]$ perl -ne'
$_ =~ tr/ //s;
print;
' data
zhang hua min ren min ren ren
zhang hua ren

[oracle@localhost ~]$ cat data
zhang?? hua???????? min ren min ren ren
zhang hua ren

#将重复的字符压缩为相同的一个;如上例前多个空格压缩为一个空格;

答? 2.10.单双引号的使用场景

[oracle@localhost ~]$ cat tmpperl #!/usr/bin/perl $a='this is a var test'; print "$a"."222221n"; $b="this is a var test"; print "$b"."222222n"; print '$b'."333333n"; print '$a'."444444n"; [oracle@localhost ~]$ ./tmpperl ? this is a var test222221????? #可以看到对于变量用单引和双引都可正常输出; this is a var test222222 $b333333??????????????????????? #可以看到在print函数中变量必须用双引包含; $a444444

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读