Perl中的正则表达

  前几天用到了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 的字符串

  在匹配中要注意转义字符的使用。正则表达式在处理字符时给我们提供很多便利,这里只是介绍了最简单的使用,并且发现字符串中隐含的模式进行匹配也是需要我们注意的,以后还要在使用中多多地学习。

原文地址:https://www.cnblogs.com/wktwj/p/4052827.html