正则表达式语法2

关键词


关键词的作用域

在表达式中,可以使用括号来表达不同符号的作用域,比如
[ ] 用于表示字符域
( ) 用于确定作用符的作用对象
{N, M}
A-Z
用于指定匹配的次数介于N,M之间
此时还可以用连字符表示字符范围
^ 在其作用域内的字符组合,需要出现在被匹配对象开头
如果该字符出现在匹配组内,则表示排除字符
$ 在其作用域内的字符组合,需要出现在被匹配对象结尾

定界符

位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式,如果需要匹配的模式中含有大量“/”符号,则使用“#”取代之,此时不必对模式中的“/”进行转义。例如

/love/

#http://www.chinaunix.com/fuchao$/i#

元字符

所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

+ one or more
* zero or more
zero or one
. everyone but \n
\s space [\t\n\r\f]
\S no space
\d digital
\D no digitial
\w word
\W no word

转义符

专业一点叫“跳脱字符”用于对上述元字符和控制字符进行转义,码工很熟,恕不多言。

注释

对于复杂的表达式,一定要给出相应的注释,以保证可读性和复用性。

注释方式为    ?#注释内容  例如:

1. $regex = '/

2.     ^host=(?<!\.)([\d.]+)(?!\.)                 (?#主机地址)

3. \|

4.     ([\w!@#$%^&*()_+\-]+)                       (?#用户名)

5. \|

6.     ([\w!@#$%^&*()_+\-]+)                       (?#密码)

7. (?!\|)$/ix';

控制符

选择符
         在表达式中添加逻辑运算符“或”完成对匹配对象的选择性匹配,例如:
         '/[love|hate]/'
惰性匹配

如果前面有限定符,会使用最小的数据。如“*”会取0个,而“+”会取1个,如过是{3,5}会取3个。例如:

1. $regex = '/heL*?/i';

2. $str = 'heLLLLLLLLLLLLLLLL';

3. if(preg_match($regex, $str, $matches)){

4.     var_dump($matches);

5. }

输出 “he”

数据捕获

没有指明类型而进行的分组,将会被获取,供以后使用。 指明类型指的是通配符。所以只有圆括号起始位置没有问号的才能被捕捉。在同一个表达式内的引用叫做反向引用。

          调用格式: \编号(如\1)。

避免捕获数据

          格式:(?:pattern)

          优点:将使有效反向引用数量保持在最小,代码更加、清楚。

命名捕获组

          格式:(?P<组名>)

          调用方式 (?P=组名)

修饰符

用于改变正则表达式的行为。

我们看到的('/^http:\/\/([\w.]+)\/([\w]+)\/([\w]+)\.html/i')中的最后一个"i"就是修饰符,表示忽略大小写ignore,还有一个我们经常用到的是"x"表示忽略空格。

通配符

用于断言某些字符串中某些字符的存在与否。需要非常注意的是,此断言出的字符不做占位符。分为两种,正向断言和反向断言:

?= 正向的断言作用域内的字符会出现在当前向后的位置
?! 与?=意义相反,用法相同
?<= 反向断言作用域内的字符组合会出现在当前向前的位置
?<! 与?<=意义相反,用法相同

如何与程序衔接

PHP中可以使用ereg()函数进行模式匹配操作,JavaScript 1.2中带有一个功能强大的RegExp()对象。大多数语言给出了对正则表达式的支持。以PHP为例。
PHP中实现了POSIX正则表达式的函数就有7个,此处举例三个:


bool ereg/eregi(string pattern, string string, [,array regs]) 在字符串string中匹配表达式pattern, 如果匹配成功返回TRUE。如果包含参数array,则按照字串规则划分并存储到数组中,带 i 表示不区分大小写。相关方法中均有此选项,下不赘述
string ereg_replace(string pattern, string replacement, string string) 在字符串中匹配表达式,匹配成功则用replacement替代匹配到的字符串,并将替换出的字符串存在string中。
array split(string pattern, string string, [,int limit]) 使用表达式来分割字符串,如果有限制参数,则分出的数组中最多有limit个元素,剩余的部分都写到最哦户一个数组元素中。

实现PCRE风格的表达式也有7个,无论从效率还是语法支持上,PCRE是优于POSIX,例如最常用的匹配测试函数
       int preg_match/preg_match_all(string pattern, string subject [,array matches])
       函数功能:在字符串中匹配表达式,函数返回匹配成功的次数,如果有数组参数,则匹配到的字符串分次存入数组中。两个函数的区别在于_all函数会一直匹配到
字符串结束。

给个例子

验证E-mail地址

这是一个用于验证电子邮件的正则表达式。但它并不是高效、完美的解决方案。在此不推荐使用。

Php代码


点击(此处)折叠或打开

  1. 1. $email ="test@ansoncheung.tk";

  2. 2. if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$email)){

  3. 3. echo "Your email is ok.";

  4. 4.} else {

  5. 5. echo "Wrong email address format";

  6. 6.}


为了更加有效验证电子邮件地址,推荐使用filer_var

Php代码


点击(此处)折叠或打开

  1. 1. if (filter_var('test+email@ansoncheung', FILTER_VALIDATE_EMAIL)){

  2. 2. echo "Your email is ok.";

  3. 3.} else {

  4. 4. echo "Wrong email address format.";

  5. 5.}



小结

正则表达式可以说是代码的灵魂,如果将程序比作开发板,她则当之无愧的成为CPU的重要组成部分。
刚开始接触正则的话,需要了解其所涉及到的关键词,熟习用法,结合函数调用进行练习。
用多了,那就尝试优化和注释你的正则,尽量规范和统一。
最后,当你发现他是一个好用的工具时,你离高手就不远了。
posted @ 2013-05-24 11:28  M小卢  阅读(183)  评论(0编辑  收藏  举报