您的位置:首页 > 其它

【perl】学习笔记(四)--正则表达式

2017-10-29 18:40 295 查看
正则表达式是Perl语言的特色,基本的语法不是很难,但是编写一个符合需求、高效的正则表达式,还是有一些挑战的。

Perl的三种匹配模式

1.查找

语法:m/正则表达式内容/;

作用:查找匹配内容中是否包含"正则表达式内容",如果包含返回1,否则返回0;

[python] view
plain copy

#!user/bin/env perl -w  

#1...  

$str1 = "i like perl";  

$result1 = ($str1 =~ m/perl/);  

print "$result1 $str1\n";  

2.替换

语法:s/正则表达式内容/替换内容/;

作用:查找匹配内容中是否包含"正则表达式内容",如果包含,使用"替换内容"替换,返回1,否则,返回0;

补充:正常情况下,如果匹配内容包含多个可匹配项,此语法只会匹配第一个,然后替换返回。

1.【真正表达式内容】可以使用()进行包含,这样做,可以在【替换内容】中使用$1,$2...进行引用,1、2为括号的顺序

2.Perl提供模式修饰词。修饰词同样适用于查找模式。

在替换语法后面添加g。表示替换所有匹配项

在替换语法后面添加e。表示替换内容需要先进行计算后再进行替换操作

在替换语法后面添加i。表示忽略大小写

在替换语法后面添加s或m。表示允许存在换行符(\n)

[python] view
plain copy

#2... 使用love替换like  

$str2 = "i like perl like i";  

$result2 = ($str2 =~ s/like/love/);  

print "$result2 $str2\n";  

  

#2...1 使用g替换所有like  

$str2_1 = "i like perl like i";  

$result2_1 = ($str2_1 =~ s/like/love/g);  

print "$result2_1 $str2_1\n";  

  

#2...2 使用e告诉perl替换内容要先计算在替换  

$str2_2 = "you should pay \$22 for this mechine!";  

$result2_2 = ($str2_2 =~ s/(22)/$1*2/e);  

print "$result2_2 $str2_2\n";  

3.转换

语法:tr/匹配内容集合/替换内容集合/;

作用:首先,匹配内容集合中元素会和替换集合中元素一一对应起来,然后执行匹配操作,匹配上的内容使用对应的退换集合中内容进行替换,返回转换元素个数.

补充:

转换模式不能使用正则表达式和变量替换。

如果【匹配内容集合】元素个数比【替换内容集合】元素多,多出的元素都会对应到【替换内容集合】的最后一个元素。

如果【匹配内容集合】元素个数比【替换内容集合】元素少,忽略【替换内容集合】中多余的元素

[python] view
plain copy

#3... 将小写转换成大写  

$str3 = "abcdefghijklmnopqrstuvwxyz";  

$result3 = ($str3 =~ tr/a-z/A-Z/);  

print "$result3 $str3\n";  

  

#3...1 匹配内容集合元素多于替换内容集合元素  

$str3_1 = "abcdefghijklmnopqrstuvwxyz";  

$result3_1 = ($str3_1 =~ tr/a-z/A-Y/);  

print "$result3_1 $str3_1\n";  

  

#3...2 匹配内容集合元素少于替换内容集合元素  

$str3_2 = "abcdefghijklmnopqrstuvwxyz";  

$result3_2 = ($str3_2 =~ tr/a-y/A-Z/);  

print "$result3_2 $str3_2\n";  

运算结果为

[python] view
plain copy

1 i like perl  

1 i love perl like i  

2 i love perl love i  

1 you should pay $44 for this mechine!  

26 ABCDEFGHIJKLMNOPQRSTUVWXYZ  

26 ABCDEFGHIJKLMNOPQRSTUVWXYY  

25 ABCDEFGHIJKLMNOPQRSTUVWXYz  

Perl的绑定操作符

上面的例子中已经使用了"=~"绑定操作符,绑定操作符的作用就是将【需要匹配的内容】和【匹配模式】绑定,然后进行计算。

绑定操作符有:

=~ : 英文【does】 表示满足匹配模式

!~ : 英文【doesnt】表示不满足匹配模式

利用上述元字符,可以组合出所有想要的匹配模式。下面介绍几个常用的正则表达式.

原载地址:http://lifesinger.3322.org/myblog/?p=185

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]

评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r

评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*

评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

评注:表单验证时很实用

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}

评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}

评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)

评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}

评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+

评注:提取ip地址时有用

匹配特定数字:

^[1-9]\d*$    //匹配正整数

^-[1-9]\d*$   //匹配负整数

^-?[1-9]\d*$   //匹配整数

^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)

^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数

^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)

^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)

评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:

^[A-Za-z]+$  //匹配由26个英文字母组成的字符串

^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串

^[a-z]+$  //匹配由26个英文字母的小写组成的字符串

^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串

^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

正则表达式的八大原则

  如果在 Unix 中曾经使用过 sed、awk、grep 这些命令的话,相信对于 Perl 语言中的正则表达式(Regular Expression)不会感到陌生。Perl 语言由于有这个功能,所以对字符串的处理能力非常强。在Perl语言的程序中,经常可以看到正则表达式的运用,在 CGI 程序设计中也不例外。

  正则表达式是初学 Perl 的难点所在,不过只要一旦掌握其语法,你就可以拥有几乎无限的模式匹配能力,而且 Perl 编程的大部分工作都是掌握常规表达式。下面给大家介绍几条正则表达式使用过程中的 8 大原则。 

  正则表达式在对付数据的战斗中可形成庞大的联盟——这常常是一场战争。我们要记住下面八条原则:

· 原则1:正则表达式有三种不同形式(匹配(m/ /),替换(s/ / /eg)和转换(tr/ / /))。

· 原则2:正则表达式仅对标量进行匹配( $scalar =~ m/a/; 可以工作; @array =~ m/a/ 将把@array作为标量对待,因此可能不会成功)。

· 原则3:正则表达式匹配一个给定模式的最早的可能匹配。缺省时,仅匹配或替换正则表达式一次( $a = 'string string2'; $a =~ s/string/ /; 导致 $a = 'string 2')。

· 原则4:正则表达式能够处理双引号所能处理的任意和全部字符( $a =~ m/$varb/ 在匹配前把varb扩展为变量;如果 $varb = 'a' $a = 'as',$a =~ s/$varb/ /; 等价于 $a =~ s/a/ /; ,执行结果使 $a = " s" )。

· 原则5:正则表达式在求值过程中产生两种情况:结果状态和反向引用: $a=~ m/pattern/ 表示 $a 中是否有子串 pattern 出现,$a =~ s/(word1)(word2)/$2$1/ 则“调换”这两个单词。

· 原则6:正则表达式的核心能力在于通配符和多重匹配运算符以及它们如何操作。$a =~ m/\w+/ 匹配一个或多个单词字符;$a =~ m/\d/" 匹配零个或多个数字。

· 原则7:如果欲匹配不止一个字符集合,Perl使用 "|" 来增加灵活性。如果输入 m/(cat|dog)/ 则相当于“匹配字符串 cat 或者 dog。

· 原则8:Perl用 (?..) 语法给正则表达式提供扩展功能。(这一点请同学们课后看相关资料)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  正则表达式 perl