本页涉及到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=("aa\n","bb\n","cc\n","\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选项用得会多些;

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


-x的选项用得少些

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


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

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


#-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";
/okjj\s/;
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 bao\nkun";
> $a =~ s/.*/ha/ig;
> print $a;
> '
haha  #这里执行了换行
haha[oracle@localhost ~]$ perl -e'
$a="zhang bao\nkun";
$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几个关于首尾的使用上没什么不同,待日后再确定?

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


#看下\G意思

下面这段摘抄于官档

Here's how to use m//gc with\G:


  1. $_ = "ppooqppqq";
  2. ($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 "', pos=", pos, "\n";
  7. print "3: '";
  8. print $1 while /(p)/gc; print "', pos=", pos, "\n";
  9. }
  10. print "Final: '$1', pos=",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 /\b555\b/;
' 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.正向前负向前的匹配替换

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


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

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

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

[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函数

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

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

#/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"."111111\n";
$b="this is a var test";
print "$b"."222222\n";
print '$b'."333333\n";
print '$a'."444444\n";
[oracle@localhost ~]$ ./tmpperl  
this is a var test111111      #可以看到对于变量用单引和双引都可正常输出;
this is a var test222222
$b333333                        #可以看到在print函数中变量必须用双引包含;
$a444444