关于Perl里面正则规范

关于Perl正则的一些规范,很多妙用。

1,定界符

=~ m/there/;
=~ s/there/here/;
还有类型的定界符:
=~ /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';

2,修改符
修改符一般放在语句最后一个正斜杠(或者其他分隔符)的后面,修改符还可在匹配范式内定义,这是用(? 修改符)来实现的。
/x 允许在范式中加上注释和额外的空白字符,以提高程序的可读性。
/i 允许不分大小写的匹配范式。
/s 单行方式,决定了圆点 . 是否匹配换行符,使用了/s,圆点就匹配换行符,否则就不匹配。
比如:

#!/usr/bin/perl

use strict;
use warnings;

my $string = ".\n.";
print "The original string is: $string\n";
my $num = $string =~ s|(.)|#|sg;
print "$num occurences change, and be changed to: $string\n";exit;

/m 多行方式,决定了脱字号 ^ 和美圆符 $ 是否匹配换行符,如果不用/s,^和$只能定位在字串的开始和结束处,它们并不匹配嵌入的换行符,这种情况等同于\A和\Z,否则不仅仅匹配字串的开始和结束,也匹配刚好处在嵌入换行符前后的一个位置。
/o 仅仅一次计算表达式的值
/e 将替代字符串作为一个表达式(仅仅在替代操作时有效)
/g 是一个全局修改符。另外,/g与while使用能在字串的所有匹配中进行遍历。修改符/G必须与/g一起使用,用来匹配前一个/g匹配的停止位置。

#!/usr/bin/perl

use 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;


3,正则里一些特殊字符
() 将表达式结组
[] 寻找一组字符
\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/option; 其中 option 为 i m s x;
(?=pattern) 前看声明,如果正则表达式在下一次匹配 pattern 风格,就开始匹配,而且不影响匹配效果。如/\w+(?=\t)/将匹配制表符是否恰好在一个字\w+后面出现,并且制表符不添加到$&的值中;
(?!pattern) 如果正则表达式在后面不匹配 pattern ,才会开始匹配。如/foo(?!bar)/,只有当出现 foo,并且后面不出现 bar 时才开始匹配;
(?<=pattern) 后看声明,只有在pattern已经匹配下面的表达式,并且不将 pattern 的结果放入$&变量中,才匹配下面的语句。如/(?<=\t)\W+/匹配制表符是否恰好在\W+前出现,但又不将制表符送到$&中;
(? (?{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/;

Monthly Archives

Pages

Powered by Movable Type 7.7.2

About this Entry

This page contains a single entry by Cnangel published on April 6, 2006 2:01 PM.

素质教育之楷模 was the previous entry in this blog.

我是一个黑客 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.