Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182064
  • 博文数量: 13
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-07 00:34
文章分类
文章存档

2018年(1)

2016年(6)

2015年(2)

2014年(4)

我的朋友

分类: 系统运维

2014-11-05 11:13:22

本章主要使用Perl来了解正则表达式,因为在所有流行的语言中Perl对正则表达式的支持很完整。

Perl简单入门

Perl是一门功能强大的脚本语言,诞生于20世纪80年代,Perl关于文本处理和正则表达式的许多概念来自两种专业化的语言:awk和sed。
Perl可以应用于很多平台,包括windows,linux,mac os,Dos。

例1:
摄氏度和华氏度的转换,脚本如下:
[root@localhost Fuck]# cat temperature.pl 
#!/usr/bin/perl
$celsius = 30;
$fahrenheit = ($celsius * 9 / 5) +32;
print "$celsius C is $fahrenheit F.\n";
给temperature.pl加上执行权限之后,直接./temperature.pl就可以执行了,也可以使用  perl  temperature.pl,  \n表示换行。
P.S:perl,python,shell脚本开头必须指定语言,如#!/usr/bin/perl     ,    #!/usr/bin/python    ,  #!/bin/bash   ,脚本名称的结尾不一定非得用pl , py , sh,这些都是为了区分脚本类型方便命名的。

Perl也提供跟其他流行语言类似的控制结构:
[root@localhost Fuck]# cat temperature-while.pl 
#!/usr/bin/perl
$celsius = 20;
while ($celsius <= 45)
{
   $fahrenheit = ($celsius * 9 /5) + 32;
   print "$celsius C is $fahrenheit F.\n";
   $celsius = $celsius + 5;
}
在条件为真(即$celsius<=45)时,while循环控制的部分会重复执行。加上执行权限后,执行的结果如下:
[root@localhost Fuck]# ./temperature-while.pl 
20 C is 68 F.
25 C is 77 F.
30 C is 86 F.
35 C is 95 F.
40 C is 104 F.
45 C is 113 F.
也可以使用  perl  -w  temperature-while.pl  来运行这个脚本,-w会告诉Perl,仔细检查程序,在Perl认为可疑的地方发出警报。

使用正则表达式匹配文本

if  ($reply =~  m/^[0-9]+$/)  {
    print  "only digits\n";
}   else  {
    print "not  only  digits\n";
}
m代表尝试进行正则表达式匹配, =~ 用来连接 m/.../和想要搜索的字符串,即 $reply。
=~   用来连接正则表达式和想要搜索的字符串。
==   用来测试两个数值是否相等。
eq    用来测试两个字符串是否相等。
=     给变量赋值。

例子:
[root@localhost Fuck]# cat temperature1.pl 
#!/usr/bin/perl
print "Enter a temperature in Celsius:\n";
$celsius=;
if  ($celsius=~m/^[0-9]+$/)
{
     $fahrenheit=($celsius*9/5)+32;
     print "$celsius C is $fahrenheit F\n";
}
else
{
     print "Expecting a number,so i don`t understand \"$celsius\".\n";
}

执行完结果如下
[root@localhost Fuck]# ./temperature1.pl 
Enter a temperature in Celsius:
20
20
 C is 68 F
[root@localhost Fuck]# ./temperature1.pl 
Enter a temperature in Celsius:
aaaaa
Expecting a number,so i don`t understand "aaaaa
".

但是这个脚本不能处理Celsius为负数和小数,所以如下:
($celsius=~m/^[-+]?[0-9]+(\.[0-9]*)?$/)
这样就完整了。

成功匹配的副作用

$! $2用来代表正则表达式括号包含的部分。与第一章的  \1  \2功能类似。

错综复杂的正则表达式

\t  代表制表符,相当于tab
\n  代表换行符。
\b  退格符

非捕获型括号  (?:...
在上面的例子中,我们用括号包围了 (\.[0-9]*)? 来进行分组作为$2,而我们并不会使用$2,它只是一个小数部分,如果有一种括号只分组而不影响文本的捕获问题就好办了,Perl提供了这种功能,如下:
(....)      分组且捕获
(?:...)    只分组不捕获
if  ($input =~ m/^([-+]?[0-9]+(?:\.[0-9]*)?)([CF])$/)
这样的话(?:\.[0-9]*)  是第二组,但是不是$2    ,    ([CF])才是$2
(?:...)好处如下:
避免不必要的捕获操作,提高了捕获效率;根据情况选择合适的括号能够让程序更清晰。

用 \s 匹配所有”空白“
\t 代表制表符。
\s  代表所有表示空白字符的字符组,包括空格,制表符,换行符和回车符。
\s*  表示很多空格。
在温度转换的例子中,CF也可以由cf小写出现,使用  i  修饰符解决,如下:
$input =~ m/^([-+]?[0-9]+(\.[0-9]*)?)\s*([CF])$/i
i 告诉正则表达式不进行大小写区别。

暂停片刻



i  表示不区分大小写,一般放在 m/正则/i
(?:...)   非捕获型括号
匹配成功后,Perl可以使用  $1 $2来表示括号内的子表达式。

使用正则表达式修改文本

以上的正则表达式都是提取文本,接下来的内容讲正则表达式  ”替换 “文本。
$var =~ s/regex/replacement/
$var =~ s/regex/replacement/i            i  表示regex不在乎大小写
$var =~ s/\bregex\b/replacement/        \b单词分界符

例子:公函生成程序

$var =~ s/regex/replacement/g      g 全局替换,对所有字符串都替换。

自动编辑操作
perl -p -i -e 's/sysread/read/g'   file
-e  表示整个程序接在命令的后面,在正则表达式之前。
-p  表示对目标文件的每一行进行查找和替换。
-i   表示将替换的结果写回到文件。

处理邮件的小工具

.*   表示一组任何字符。

用环视功能为数值添加逗号

有的数值有逗号就比较容易识别,例如
print  "The US population is $pop\n";
298,444,215
用环视就能很好的给数字加上逗号。

P.S  
(?:...)       分组但不捕获
(?=...)      顺序环视,意即在此位置的右边。
(?<=...)    逆序环视,意即在此位置的左边。
(?! )           否定顺序环视,意即右边不是。。。
(? PS:
环视功能在Perl中很少使用。

Text-to-HTML转换

好难哇。。。























阅读(2442) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~