解析posix与perl标准的正则表达式区别

By admin in 计算机教程 on 2019年7月21日

$也能匹配\n

正则表达式(Regular
Expression,缩写为regexp,regex或regxp),又称正规表达式、正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用
来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本
内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的在正则表达式引擎。正则表达式这个概念最初是由
Unix中的工具软件(例如sed和grep)普及开的。(摘自维基百科)

见Perl语言入门,page 132, 注释6

PHP同时使用两套正则表达式规则,一套是由电气和电子工程师
协会(IEEE)制定的POSIX Extended
1003.2兼容正则(事实上PHP对此标准的支持并不完善),另一套来自PCRE(Perl
Compatible Regular
Expression)库提供PERL兼容正则,这是个开放源代码的软件,作者为 Philip
Hazel。

1 /^.*$/能匹配”\n”么?能!因为$不仅能匹配行尾,也能匹配\n
2 /^.*$/能匹配”b\n”么?能!.能b匹配. \n匹配$
3
/^.*$/能匹配”\nb”么?不能!为什么?因为默认情况下,.不能匹配\n,把模式改一下变成/^.*$/s就可以了,/s表示.能匹配任意字符,包括\n

使用POSIX兼容规则的函数有: ereg_replace()
ereg()
eregi()
eregi_replace()
split()
spliti()
sql_regcase()
mb_ereg_match()
mb_ereg_replace()
mb_ereg_search_getpos()
mb_ereg_search_getregs()
mb_ereg_search_init()
mb_ereg_search_pos()
mb_ereg_search_regs()
mb_ereg_search_setpos()
mb_ereg_search()
mb_ereg()
mb_eregi_replace()
mb_eregi()
mb_regex_encoding()
mb_regex_set_options()
mb_split()

多行匹配/m

使用PERL兼容规则的函数有: preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()

看一个例子,这段代码输出:hello

定界符:

复制代码 代码如下:

POSIX兼容正则没有定界符,函数的相应参数会被认为是正则。

my $text = “hello, world,\nhello zdd,\nhello autumn”;
while ( $text =~ /^hello/g ) {
    print “hello\n”
}

PERL兼容正则可以使用任何不是字母、数字或反斜线(\)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[]
和 <> 作为定界符

稍微改变一下,加上/m选项

修正符:

复制代码 代码如下:

POSIX兼容正则没有修正符。

my $text = “hello, world,\nhello zdd,\nhello autumn”;
while ( $text =~ /^hello/mg ) {
    print “hello\n”
}

PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误):

现在输出变成了
hello
hello
hello

i (PCRE_CASELESS): 匹配时忽略大小写。

注解: 默认情况下,^和$匹配整个字符串的开头和结尾,但是加上/m之后,^和$就匹配每行的开头和结尾。也就是说,因为字符串中有换行符\n,所以/m选项使得^$匹配每行的开头和结尾。
如果字符串中没有换行符,那么/m选项是不起作用的。

m(PCRE_MULTILINE): 当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(\n)的之后和之前。

您可能感兴趣的文章:

s(PCRE_DOTALL): 如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。

x(PCRE_EXTENDED): 如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。

e: 如果设定了此修正符,preg_replace()
在替换字符串中对逆向引用作正常的替换,将其作为 PHP
代码求值,并用其结果来替换所搜索的字符串。 只有 preg_replace()
使用此修正符,其它 PCRE 函数将忽略之。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门金沙30064在线网站 版权所有