前几天用到了Perl语言,主要看了一下Perl中的正则表达式,在各种网页语言中,正则表达式在处理字符串的时候十分有用,所以这里就简单说一下在Perl中正则表达式的应用。
先上代码
1 #!/usr/bin/perl -w 2 #use utf8; 3 #use encoding "gb2312"; 4 5 open(DATA,"<test2.txt") or die "read error"; 6 7 open(OUT,">outfile.txt") or die "write error"; 8 %array=(); 9 while ($string =<DATA>){ 10 11 if ($string =~ /s.*.m/) { 12 $string =~ s/s.*.m//g; 13 14 } 15 chomp($string); #去掉换行符 16 foreach $character(split / /,$string){ 17 if ($character =~ //d$/) 18 { 19 $array{$character}++; 20 }#code 21 } 22 } 23 print OUT "result: "; 24 @character = sort {$array{$b} <=> $array{$a} }( keys %array); 25 foreach $character (@character){ 26 print OUT "$character => $array{$character} "; 27 }
简单说一下就是,读取文件内容到字符串,去掉换行符,按空格分割(spilt),匹配到以s开头,以m结束的字符串,然后以空串替换之(删除),匹配到以d结束的字符串,存到数组中,最后按降序输出到文件。实际就是删除s开头,m结尾的单词,找到所有以d结束的单词,并统计。
这里使用关联数组进行统计,可以使用任意标量(keys)作为索引值,便于以后检索。
值得注意的是,*是贪婪匹配,它会尽可能地向后匹配直到匹配成功,要想尽可能少地匹配,需要
$string =~ s/s.*?.m//g
正则表达式
(1)三种形式
匹配:m/<regexp>;/ (还可以简写为 /<regexp>;/ ,略去 m)
替换:s/<pattern>;/<replacement>;/
转化:tr/<pattern>;/<replacemnt>;/
这三种形式和“=~”或“!~”搭配使用,分别表示匹配和不匹配,在上述代码中用到了匹配符号。
(2)常用模式(pattern)
. 匹配除换行符以外的所有字符
x? 匹配 0 次或一次 x 字符串
x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数
x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数
.* 匹配 0 次或一次的任何字符
.+ 匹配 1 次或多次的任何字符
{m} 匹配刚好是 m 个 的指定字符串
{m,n} 匹配在 m个 以上 n个 以下 的指定字符串
{m,} 匹配 m个 以上 的指定字符串
[] 匹配符合 [] 内的字符
[^] 匹配不符合 [] 内的字符
[0-9] 匹配所有数字字符
[a-z] 匹配所有小写字母字符
[^0-9] 匹配所有非数字字符
[^a-z] 匹配所有非小写字母字符
^ 匹配字符开头的字符
$ 匹配字符结尾的字符
d 匹配一个数字的字符,和 [0-9] 语法一样
d+ 匹配多个数字字符串,和 [0-9]+ 语法一样
D 非数字,其他同 d
D+ 非数字,其他同 d+
w 英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样
w+ 和 [a-zA-Z0-9]+ 语法一样
W 非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样
W+ 和 [^a-zA-Z0-9]+ 语法一样
s 空格,和 [ f] 语法一样
s+ 和 [ f]+ 一样
S 非空格,和 [^ f] 语法一样
S+ 和 [^ f]+ 语法一样
匹配以英文字母,数字为边界的字符串
B 匹配不以英文字母,数值为边界的字符串
a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串
abc 匹配含有 abc 的字符串
在匹配中要注意转义字符的使用。正则表达式在处理字符时给我们提供很多便利,这里只是介绍了最简单的使用,并且发现字符串中隐含的模式进行匹配也是需要我们注意的,以后还要在使用中多多地学习。