本页涉及到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选项用得会多些;
-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";
/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几个关于首尾的使用上没什么不同,待日后再确定?
#看下\G意思
下面这段摘抄于官档
Here's how to use m//gc
with\G
:
- $_ = "ppooqppqq";
- ($i++ < 2) {
- print "1: '";
- print $1 while /(o)/gc; print "', pos=", pos, "\n";
- print "2: '";
- print $1 if /\G(q)/gc; print "', pos=", pos, "\n";
- print "3: '";
- print $1 while /(p)/gc; print "', pos=", pos, "\n";
- }
- print "Final: '$1', pos=",pos,"\n" if /\G(.)/;
The last example should print:
- 1: 'oo', pos=4
- 2: 'q', pos=5
- 3: 'pp', pos=7
- 1: '', pos=7
- 2: 'q', pos=8
- 3: '', pos=8 #位置已经到结尾,加了/c参数位置不会被重置从0开始
- 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.正向前负向前的匹配替换
这个也是简单的,只要记住下符号即行;
概括:没有!意思就是指不匹配的结构称作“负”,有就是指匹配结构称作“正”;
向前与向后是针对所查找的小括号的内的字符的位置而言,放前面的匹配查找就是“正向前查找”;
[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"."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