Perl正则,perl正则表达式匹配中文

Perl正则,perl正则表达式匹配中文,Perl中的正则表达式介绍

正则表达式是Perl语言的一大特色,也是Perl编程的难点。但是,如果你能很好地掌握它,你可以很容易地使用正则表达式来完成字符串处理的任务,尤其是在CGI程序设计中。

感谢AKA和作者。

Perl 中的正则表达式三种形式的正则表达式

正则表达式中的常见模式

正则表达式的八个原则

正则表达式是Perl语言的一大特色,也是Perl编程的难点。但是,如果你能很好地掌握它,你可以很容易地使用正则表达式来完成字符串处理的任务,尤其是在CGI程序设计中。下面是一些编写正则表达式的基本语法规则。

9.1正则表达式的三种形式首先要知道Perl程序中有三种形式的正则表达式。它们是:

匹配:m/regexp;/(也可以缩写为/regexp;/,省略m)

替换为:s/模式;/替换;/

转型:tr/pattern;/replace mnt;/

这三种形式一般都带=~或者!~连用(其中'=~ '表示匹配,读起来就像整个句子一样,'!~ '表示不匹配,在整个语句中读作not ),是左边要处理的标量变量。没有这个变量并且=~!~运算符,默认是处理$ _变量的内容。例子如下:

$str='我爱Perl ';$ str=~ m/Perl/;#表示如果在$str中找到“Perl”字符串,则返回“1”;否则,返回“0”。$ str=~ s/Perl/BASH/;#表示用' BASH '替换变量$str中的' Perl '字符串。如果发生这种替换,它将返回“1”;否则,它将返回“0”。$str!~ tr/A-Z/A-Z/;#表示变量$str中的所有大写字母都被转换为小写字母,如果发生转换,则返回“0”,否则返回“1”。

此外:

foreach(@ array){ s/a/b/;} #这里每个循环都会从@array数组中取出一个元素存储在$ _变量中,替换掉$ _。while(文件;){ print if(m/error/);} #这句话有点复杂。它将打印文件FILE中包含错误字符串的所有行。

如果()出现在Perl的正则表达式中,匹配或替换后的()中的模式被Perl解释器依次自动赋给system $1,$2.请看下面的例子:

$string='我爱perl ';$ string=~ s/(love)/$ 1;/;#此时$1='love ',而这个替换的结果是将$string改为' I loveperl'$string='我爱perl ';$string=~ s/(i)(。*)(perl)/$ 3;$2$1;/;#这里$1='i ',$2=' love ',$3='perl ',替换后$string变成' perl ';爱我;'

操作s/模式被替换;/替换;/还可以在末尾添加E或G参数,它们的含义是:

s/模式;/替换;/g表示所有要处理的字符串都符合模式;用替换替换所有模式;字符串,而不只是替换第一次出现的模式。s/模式;/替换;/e表示replacemnet将被更改;部分作为操作者,这个参数用的不多。

例如,下面的例子:

$ string=' I:love:perl ';$ string=~ s/:/*/;#此时$ string=' I * love:perl ';$ string=' I:love:perl ';$ string=~ s/:/*/g;#此时$ string=' i * love * perl$ string=~ tr/*//;#此时$string='我爱perl ';$ string=' www22cgi44$ string=~ s/(\ d)/$ 1 * 2/e;# (/d)表示$string中的一个或多个数字字符,这些数字字符由*2操作,所以最后$string就变成了' www44cgi88 '。

下面是一个完整的例子:

#!/usr/bin/perl

请输入一个字符串!\ n ';$ string=STDIN;# STIDN代表标准输入,允许用户输入一个字符串chop($ string);#删除$string的最后一个换行符\ n f($ string=~/perl/){ print('输入字符串中有perl!\ n ';}

如果输入字符串包含perl,将显示以下消息。

9.2正则表达式中的常见模式以下是正则表达式中的一些常见模式。

/模式/结果。匹配除换行符以外的所有字符x?匹配0次或1次x字符串x*匹配0次或更多x字符串,但至少匹配可能的次数x匹配1次或更多x字符串,但至少匹配可能的次数。*匹配任意字符0次或1次。任何匹配1次或更多次的字符{m}精确匹配m个指定的字符串{m,N}匹配多于m个但少于N个指定的字符串{m,}匹配多于m个指定的字符串[]匹配[]中的字符[]匹配[]中的字符[0-9]匹配所有数字字符[a-z]匹配所有小写字母字符[0-z]匹配所有非数字字符[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] \s空格相同,与[\n\t\r\f B匹配以英文字母和数字为界的字符串\ B匹配以非英文字母和数字为界的字符串a|b|c匹配字符串用A字符,B字符或C字符abc匹配字符串用abc()这个符号会记住找到的字符串,这是一个非常实用的语法。 在第一个()中找到的字符串变成$1或\1,在第二个()中找到的字符串变成$2或\2,依此类推。/pattern/i i这个参数的意思是忽略英文的大小写,也就是在匹配字符串的时候,不考虑英文的大小写。\如果您想在模式pattern中找到一个特殊字符,如' * ',您应该在该字符前添加一个\符号,这样该特殊字符将无效。

以下是一些例子:

示例/perl/find strings with perl/perl/find strings with perl on begin/perl $/find strings with perl on the end/C | G | I/find strings with C or G or i /cg{2,4}i/find c后跟2到4个G,然后按照I/CG { 2,}i/的字符串查找C后跟2个以上G,然后按照I /cg{2}i/的字符串查找C后跟0个或更多G,然后按照字符串like /cg{0,1}i//cg i/I/查找c后面跟0或1 g,后面跟I的字符串,like /cg{0,1}i//c.i/查找c后面跟任意字符,后面跟I /c的字符串.i/查找c后跟两个任意字符的字符串,然后跟随I /[cgi]/的字符串查找匹配这三个字符中任何一个的字符串/[cgi]/查找不含这三个字符中任何一个的字符串/\d/查找匹配一个数字的字符。您可以使用/\D/来表示由一个或多个数字组成的字符串/\ D/来查找与非数字匹配的字符。您可以使用/\ D/来表示一个或多个非数字字符串/\ */查找匹配*的字符。因为*在正则表达式中有其特殊含义,所以需要在这个特殊符号前加一个\号,这样这个特殊字符就无效了。/abc/i查找与abc匹配的字符串,而不考虑这些字符串的大小写。

9.3正则表达式的八个原则如果你曾经在Unix中使用过sed、awk、grep这些命令,相信你对Perl中的正则表达式不会陌生。Perl有这个功能,所以处理字符串的能力很强。Perl程序中经常使用正则表达式,CGI编程也不例外。

正则表达式是初学者学习Perl的难点,但是一旦掌握了它的语法,就可以拥有几乎无限的模式匹配能力,而Perl编程的大部分工作就是掌握正则表达式。以下是使用正则表达式的八条原则。

正则表达式可以在与数据的战斗中形成一个巨大的联盟,这往往是一场战争。我们应该记住以下八项原则:

原则1:正则表达式有三种不同的形式(match (m//)、replace (s//eg)和transform (tr///))。

原则二:正则表达式只匹配标量($ scalar=~ m/a/;能工作;@array=~ m/a/会把@array当作标量,所以可能不会成功)。

原则3:正则表达式匹配给定模式的最早可能匹配。默认情况下,正则表达式只匹配或替换一次($ a=' string string2$ a=~ s/string//;导致$a='string 2 ')。

原则四:正则表达式可以处理双引号可以处理的任何及所有字符($a=~ m/$varb/匹配前将varb展开成变量;如果$varb='a' $a='as ',$ a=~ s/$ varb/;相当于$ a=~ s/a//;执行结果使得$a=' s ')。

原则五:正则表达式求值过程中,有两种情况:结果状态和反向引用:$a=~ m/pattern/表示$a中是否有子串模式,而$a=~ s/(word1)(word2)/$2$1/则“交换”这两个字。

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

原则7:如果您想要匹配多个字符集,Perl使用“|”来增加灵活性。如果输入m/(猫|狗)/,相当于“匹配字符串猫或狗”。

原则8: Perl使用(?)语法为正则表达式提供了扩展函数。(请课后阅读相关资料。)

想把这些原理都学会?建议你从简单的开始,不断尝试和试验。事实上,如果你学会了$a=~ m/ERROR/是在$a中查找子串错误,那么你就已经获得了比c这样的低级语言更大的处理能力。

补充:

好明了,但是原文中的\w英文字母或数字的字符串和【a-zA-Z0-9】的语法一样,好像错了。我觉得还应该包括一个下划线,就是[a-zA-z0-9]。

/cg*i/找到C后面跟0个或更多G后面跟I的字符串,就像/cg{0,1}i/这句话也是错别字。应该是/cg*i/查找C后跟0个或更多G后跟I的字符串,就像/cg {0,1} i/

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: