Perl小骆驼学习笔记 - 9. 用正则表达式处理文本
1.查找与替换
s/查找模式/替换/;
(可以单独成一行,直接完成对$_中元素的查找和替换,返回值为布尔值,也就是说可以用在while或者if的条件语句中)
2. 用/g完成全局替换
s/find/replace/g
可以对$_中所有匹配成功的变量进行替换。
最常见的替换时减少空白符:
s/\s+//g;
或者替换开头或者结尾的长串空白符:
s/^\s+|\s+$//g;
3. 定界符的使用
和m//,qw//一样,s///定界符也可以是多样的, 但是对于成对出现的符号{},[]写法略有不同;
s{}{};另外前后定界符也可以不一致:s{}[];
4. 可用的替换修饰符
除了/g外,还可以采用/i 不区分大小写;/s 匹配任何字符,/x 可以加任意空白符。
5. 绑定操作符
可以自行给s///制定目标了:
$name =~ s///;
6. 大小写转换
\U转义符可以将他后面的字符全变成大写;
\L将其后全变成小写;
\u,\l只改变紧邻的值得大小写;
可以配合使用:
比如:\u\L:将其后小写,但首字母大写;
7. split操作符
根据所给出的模式来拆分字符串:
my @array = split /匹配模式 /, $strings;
注:
1. 拆分之后是给数组@array了
2. my @array = spilt;表示去除开头空字段
3. split一般会保留开头空字段,但是会丢弃结尾的空字段
4. 匹配模式内不要加(),若要加采用(?:)非捕获写法
5. 拆分之后相当与数组有了两个部分:模式前内容和模式后内容
8. join函数
join在功能上来看是split的反向应用:
my $something = join $glue, @pieces;
$glue 表示一个字符串,
@pieces 可以是一个元素大于2的数组,或者是系列由,隔开的字符串/字符;
@pieces:元素必须大于2,不然就会返回空。
一般讲join和split进行联合使用:
my @value = split /:/, "4:6:8:10";my $z = join "-", @value;
$z是4-6-8-10;
9. 列表上下文中的m//
分别捕获数据:
$_= "......";
my ($A,$B,$C) = /()()()/;捕获的内容放在三个变量里,比前面说的给捕获前面加:?<>,简单一点。
其次,
my @array = (my $name = ~ //);把匹配的内容给一个数组;
my %array = (my $name =~ / ()\s+())/;每次取两个内容作为哈希的键和值;
10.更加强大的正则表达式
1. 非贪婪量词
贪婪量词:+,*,?,{n,m};
非贪婪量词 ’:‘
贪婪量词 ’?‘;
1. 工作机制有区别
区别:在替换数据时候会产生差异:
$_ = <ooo>wilma</ooo>, and <ooo>hahah</ooo>;s#<ooo>(.*)</ooo>#$1#g;
贪婪量词:会留下wilma</ooo>, and <ooo>hahah
s#<ooo>(.*?)</ooo>#$1#g;
非贪婪:wilma, and hahah
2. 跨行的模式匹配
^,$ 配合/m时表示每一行的行首和行尾;
我们可以利用^,$确定行首和行尾进行匹配;
ex.
open FILE ,$filename or die " open failled";my $lines = join ' ', <FILE>;$line =~ s/^/begin:/mi;
在句柄文件指示的文件里的行首加入 begin:
3. 一次更新多个文件
#!/usr/bin/perluse 5.010;use strict;$^I=".bak"; #表示处理过程中的备份文件后缀,如果不要备份,写成空字符也可以。while(<>){s/^(.*)abc(.*)/ABC/m;print;}
可以完成一系列文件的修改,原文件被备份在.bak中;
4.从命令行直接编辑
perl -p -i.bak -w -e 's/a/b/g' fred*.dat;
perl 相当于#!/usr/bin/perl
-p:生成一个while(<>){print;}
(-n:生成while(<>){})
-i.bak: 备份,扩展名为.bak
-w: warning
-e:后面时可执行程序
'...':执行的内容;
fred*dat:访问的文件名。
总结
本节描述在文本的上下文高效实现匹配的一些方式,在处理文本机制时较为常用。至此,模式匹配的部分基本完成了,后续在实际的使用中,需要彼此的结合使用才能更好的发挥对应的能力。