perl 正则表达式

正则表达式的能力的核心在于通配符和多重匹配运算符。通配符运算符允许匹配字符串中的多个字符。如果正在处理二进制数据,那么通配符就匹配一系列字符。多重匹配运算符可匹配零个、一个或多个字符。就讲解Perl的基础而言,到目前为止我们所使用的例子都是带启发性的,但功能并不是很强大。实际上,渎者可能会用C子程序去完成它们中的任意—个。Perl 正则表达式集合的强大功能来自于其匹配文本的多模式能力,(即:通过前面提到的逻辑“速记法”来描述许多不向的数据模式)。Perl正好可提供最好的速记法。

1.通配符

通配符代表字符类。他没有如下字符串,但不知道他们是否大写:

.Kumquat

.Kristina

.Kentucky

.Key

.Keeping

这种情况下,如下的Perl表达式会匹配每个单词的第一个字符:

[Kk]

这是字符类的一个例子。Perl中的所有通配符可以用括号[并把想匹配的字符类放在括号中最后加上结尾括号]这种方法表示。前面的通配符告诉正则表达式引擎"好,我正在这里查找"K"或者"R"。如果发现两者之一那么就匹配它”。下面是另一些使用通配符的例于:

$scalarName = ' this has a digit (1) in it';

$scalarName =~ m" [0-9]"; # This matches any character between 0 and 9, that is matches any digit.

$scalarName =~ 'this has a capital letter (A) in it';

$scalarName =~ m" [A-Z]"; # This matches any capital letter (A-Z).

$scalarName =~ " this does not match, since the letter after the string 'AN' is an A"

$scalarName =~ m" an[^A]";

前两个例子相当直观,[0-9]匹配this has a digit(1) in it中的数字1。[A—Z]匹配this has acapital letter(A) in it中的大写字符A。最后一例稍有点技巧,因为在这个模式中仅有一个an,所以可能被匹配的字符唯有最后的四个字符,即an A。

然而,通过询问模式an[^A]我们已经明确地告诉正则表达式去匹配a,接着是n,空格,最后一个为非A的字符。因而,该例中没有完成匹配。如果给定模式为 match an A not an e,那么匹配就会完成,因为第一an被跳过后,第二个正好匹配!就像如下例子:

$scalarName = " This has a tab( ) or a newline in it so it matches";

$scalarName =~ m" [/t/n]" # Matches either a tab or a newline.

# matches since the tab is present.

这个例子说明了用匹配和通配符可以做的一些有趣的事情。首先,读者已经在""字符串插入的相同字符也可以在正则表达式和用括号表示的字符类中([t/n])插入。其中"/t"匹配制表符,"/n"匹配换行符。

其次.如果读者在[]里的开头部分放置一个^,则通配符会匹配非字符组中的字符。同样地,如果在[ ]中放置-,则通配符匹配给定的范围(在这个例子中是所有的数字[0-9]。所有的大写字母([A-Z])。这些运算符还可被合并,从而得到相当特别的通配符:

$a =~ m" [a-fh-z]"; # matches any lowercaes letter * except* g.

$a =~ m" [^0-9a-zA-Z]"; # matches any nonword character. (i.e.,NOT

# a character in 0-9, a-z or A-Z)

$a =~ m" [0-9^A-Za-z]"; # a mistake, Does not

# equal the above. Instead matches 0-9,

$a =~ m" [/t/n]"; # matches a space character: tab, newline or blank).

需许意的重要地方是第三个例子,在[0—9^A—Za—z]中的插入记号是一个字面上的插入记号,而不是代表否定,原因是它在字符类的中间出现。因此,如果读者想得到一个否定的字符类。那么就总是要把插入记号放在[]开头。也不要忘记用[]。如果读者忘记了[],那么得到的将是一个字面上的文本字符串,而不是一个字符类。

(1)公用通配符

碰巧某些通配符是公用的;当读者每次想匹配一个数字时,可能不愿意每次都必须要输入类似于[0-9]这样的代码。对于那些情况,Perl有几个方便的快捷通配符,使用它们后可使编程工作容易。下面是这些边配符以及它们代表的含义和它们对应的字符组合:

./d — 匹配数字(字符组合[0-9])。

./D — 匹配非数(字符组合[^0-9])。

./w — 匹配单词字符(字符组合[a-zA-Z0-9_])(这里下划线算作一个单词字符)。

./W — 匹配非单词字符(字符组合[^a-zA-Z0-9_])。

./s — 匹配空格字符(字符组合[/t/n])(制表符、换行符、空格)。

./S — 匹配非空格字符(字符组合[/t/n])。

.- 匹配任意字符(在某些情况下)换行符除外(字符组合[^/n])、当输入m"(.*)"S时匹配任意字符。参见本章后面的修饰符。

.$- 尽管它实际上并不是一个通配符(它不匹配任何具体字符).但它是广泛使用的特殊字符;如果将其放在正则表达式的尾部则它匹配“行尾”。零宽度断言。

.^- 尽管实际上不是一个通配符,但如果它位于正则表达式的开头则它是匹配“行首”的特殊字符。零宽度断言。

./b,/B- 与$和^相同;不匹配字符,但匹配单词边界(/b)或匹配无单周边(/B)。零宽度断言。

我们从表中注意到的第一点是“点”通配符(.)。它常与多重匹配运算符一道用于在条目间充当填充者。请看以下匹配:

$a = ' NOW is the time for all good men to come to the aid of their party';

$a =~ m" (Now).*(party)"; # matches, since ' .' matches any

character except newline

and ' *' means match zero or more characters.

*捕获位于Now和party中间的所有字符,匹配是成功的。(在这种环境下的“所有”意味着“零或者更多,尽可能多”。这就是所谓的贪梦(greediness);在我们后面谈到多重匹配运算时再谈它。)

下面是通配符的一些其他例子。注意我们在=~的左边使用了单引用字符串(这是一个测试表达式的简单方法):

1 ' 1956.23' =~ m" (/d+)/.(/d+)"; # $1 = 1956, $2 = 23

2 ' 333e+12' =~ m" (/D+)"; # $1 = ' e+'

3 ' $hash($value)' =~ m" /$(/w+){/$(/w+)}"; # $1 = ' hash', $2 = 'value'

4 ' $hash($value)' =~ m" /$(/w+){(/w)*(/w+)(/w*)}"; # $1 = ' $', $2 = ' hash',

# $3 = ' $', $4 = ' value'

5 ' VARIABLE = VALUE' =~ m" (/w+)(/s*) = (/s*)(/w+)"; # $1 = ' VARIABLE', #$2 = ' ',

# $3 = ' ', $4 = ' VALUE'

6 ' catch as catch can' =~ m" ^(.*)can$; # $1 = ' catch as catch'

7 ' can as catch catch' =~ m"^can(.*)$ # $1 = ' as catch catch'

8 ' word_with_underlines word2' =~ m" /b(/w+)/b; # $1 = word_with_underlines

 

 

常用perl正则表达式

匹配中文字符的正则表达式: [/u4e00-/u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^/x00-/xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:/n/s*/r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(/S*?)[^>]*>.*? |<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^/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个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值