|   
 UID1 威望1240 点 金钱24019 金币 点卡317 点 
 | 
1#
 发表于 2005-9-2 13:25 
 | 只看该作者 
 [原创]关于Perl正则的一些心得
| 1,定界符 =~ m/there/;
 =~ s/there/here/;
 还有类型的定界符:
 2,修改符复制代码=~ /there/=~ m#there#;=~ s#there#here#;=~ m(there);=~ s(there)(here);=~ m{there};=~ s{there}{here};=~ m[there];=~ s[there][here];=~ m,there,;=~ s,there,here,;=~ m.there.;=~ s.there.here.;=~ m|there|;=~ s|there|here|;=~ m';there';;=~ s';there';here';;
修改符一般放在语句最后一个正斜杠(或者其他分隔符)的后面,修改符还可在匹配范式内定义,这是用(? 修改符)来实现的。
 /x 允许在范式中加上注释和额外的空白字符,以提高程序的可读性。
 /i 允许不分大小写的匹配范式。
 /s 单行方式,决定了圆点 . 是否匹配换行符,使用了/s,圆点就匹配换行符,否则就不匹配。
 /m 多行方式,决定了脱字号 ^ 和美圆符 $ 是否匹配换行符,如果不用/s,^和$只能定位在字串的开始和结束处,它们并不匹配嵌入的换行符,这种情况等同于\A和\Z,否则不仅仅匹配字串的开始和结束,也匹配刚好处在嵌入换行符前后的一个位置。
 /o 仅仅一次计算表达式的值
 /e 将替代字符串作为一个表达式(仅仅在替代操作时有效)
 /g 是一个全局修改符。另外,/g与while使用能在字串的所有匹配中进行遍历。修改符/G必须与/g一起使用,用来匹配前一个/g匹配的停止位置。
 如
 3,正则里一些特殊字符复制代码#!/usr/bin/perluse strict;use warnings;my $string = "~32sda13dAZ.';sDa#!3_C-!";print "The original string is: $string\n";my $num = $string =~ s.\w.#.g;print "$num occurences change, and be changed to: $string\n";exit;
() 将表达式结组
 [] 寻找一组字符
 \d 等于 [0-9]
 \D 等于 [^0-9]
 \w 等于 [0-9A-Za-z_]
 \W 等于 [^0-9A-Za-z_]
 \s 等于 [\f\n\r\t ]
 \s 等于 [^\f\n\r\t ]
 .  等于 [^\n]
 4,关于一些特殊符号
 \b 不属于空白字符,向前缩进一个字符
 \t 属于空白字符,匹配制表符
 \r 属于空白字符,匹配回车符
 \a 不属于空白字符,匹配闹钟符
 \e 不属于空白字符,匹配转义符
 \033 不属于空白字符,匹配八进制符
 \x1B 不属于空白字符,匹配十六进制符
 \c[ 不属于空白字符,匹配控制字符
 属于空白字符,匹配空格
 属于空白字符,匹配制表符
 \f 属于空白字符,匹配换页符
 \n 属于空白字符,匹配换行符
 \0 不属于空白字符,功能不详
 \c 不属于空白字符,功能不详
 \x 不属于空白字符,功能不详
 5,注意正则里的选择符的特殊性
 选择运算符是所有运算符中优先级最低的,这意味着它最后执行。
 6,正则里的限定符的一些经典用法
 限定符常常与一些字符或词联合使用
 * 匹配任意数个;
 + 匹配一个或多个;
 ? 匹配零个或一个;
 {n} 匹配 n 个;
 {n,m} 匹配 n 至 m 个;
 {n,} 匹配 n 和 n 个以上;
 限定符贪婪好像与生俱有的。在缺省状态下,*或+限定符匹配满足正则表达式的一个范式的最大实例数。可用?号显式的规定限定符的不贪婪。如果问号放在另一个限制符之后(甚至另一个问号之后),都可以使限定符不贪婪。
 7,声明与断言
 首先注意声明的长度为 0;
 Perl种有一组控制大小写和换码的声明:
 \u 使下一个字母变大写;
 \l 使下一个字母变小写;
 \U 使文本的剩余字符变成大写;
 \L 使文本的剩余字符变成小写;
 \Q 会除字母之外的其他字符进行换码处理,直至遇到 \E 声明、常规表达式结束或者字串结束。
 \A声明和脱字符号(^)匹配字串的开始;
 \Z声明和美元符号($)匹配字串的结束或刚好在字串结束前的换行符;
 \z 只匹配字串的结束;
 \b 匹配一个单词(字)边界;
 \B 匹配一个非单词(字)边界;
 (?#text) 忽略括号内的注释文本;
 (?:pattern) 与组一致,但匹配时不生成$1,$2;
 (?imsx:pattern) 与组一致,但匹配时不生成$1,$2,在特定的风格有效期间,内嵌风格匹配修饰符;
 (?=pattern) 前看声明,如果正则表达式在下一次匹配 pattern 风格,就开始匹配,而且不影响匹配效果。如/\w+(?=\t)/将匹配制表符是否恰好在一个字\w+后面出现,并且制表符不添加到$&的值中;
 (?!pattern) 如果正则表达式在后面不匹配 pattern ,才会开始匹配。如/foo(?!bar)/,只有当出现 foo,并且后面不出现 bar 时才开始匹配;
 (?<=pattern) 后看声明,只有在pattern已经匹配下面的表达式,并且不将 pattern 的结果放入$&变量中,才匹配下面的语句。如/(?<=\t)\W+/匹配制表符是否恰好在\W+前出现,但又不将制表符送到$&中;
 (?<!pattern) 只有当 pattern 与下面的表达式不匹配时,但是不必将 pattern 的结果存放到$&变量。如/(?<!bar)foo/匹配没有跟随在bar后的foo的出现次数;
 (?{code}) 表示对 code 的使用是试验性的。如果返回真,就认为是与(?:pattern)断言同一行里的匹配。code 不插入变量。这个断言仅仅在 use re ';eval'; 编译指示符时才有效;
 (?>pattern) 如果类型锁定在当前位置,就使用单独的 pattern 匹配子字符串。如正则表达式/^(?>a*)ab/永远不会匹配,因为语句(?>a*)将匹配字符串开头所有的 a 字符,并删除与 ab 匹配的字符 a;
 (!<=pattern) 非后看声明,与后看声明意思相反;
 (!=pattern) 非前看声明,与前看声明意思相反;
 (?(condition)yes-pattern|no-pattern) 条件表达式——条件语句或者是一个圆括号中的整数,或者是一个断言;
 (?(condition)yes-pattern)
 (?imsx) 嵌入风格匹配修饰符。当要把表达式修改符嵌入在变量中,然后把变量用在不指定自己的修饰符的一般规则表达式中;
 (?-imsx) 这个断言很有用——后面带任何内容都会关闭修饰符,直到出现另一个嵌入的修饰符。
 8,向后引用
 Perl的正则表达式引擎允许使用前面匹配好的值,这些值叫做向后引用。
 例如:
 复制代码=~ m/(\w)\W*(\w)\W*(\w)\W*(\w)\W*\4\W*\3\W*\2\W*\1/;=~ s/(\w)\W*(\w)\W*(\w)\W*(\w)/$4$3$2$1/;
 | 
 
| 我是一个呼吸着现在的空气而生活在过去的人
 这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
 我已习惯了孤独,爱上孤独
 他让我看清了自我,还原了自我
 让我再静静的沉思中得到快乐和满足
 再孤独的世界里我一遍又一遍
 不厌其烦的改写着自己的过去
 延伸到现在与未来
 然而那只是泡沫般的美梦
 产生的时刻又伴随着破灭的到来
 在灰飞烟灭的瞬间我看到的是过程的美丽
 而不是结果的悲哀。。。
 
 |  |