IT民工一枚,为学弟学妹造福是我一直写博文的动力!为媳妇提供技术支持是我学习新技术的动力!为自己脱离贫困线,买到心仪的摩托车,有饭吃,有床睡,有妹把,笔耕不辍~~
2013年(54)
分类: 敏捷开发
2013-04-28 12:44:38
正则表达式总是那么神秘,反复学了多次,总也不能信手拈来,每每用到都需要查手册,虽也方便,却很烦燥。所以需要正式的整理一番,写出来,清楚一些。
正则表达式一定离不开模式匹配这个更显高级的词汇,模式匹配跟门当户对有点像。
正则表达式也就可以说是根据用户给出的规则,机器实现自动匹配的相关指令。简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。我们什么时候使用正则表达式呢?不是所有的字符操作都用正则就好了,在某些方面用正则反而影响效率。当我们遇到复杂文本数据的解析时候,用正则是比较好的选择。
在表达式中,可以使用括号来表达不同符号的作用域,比如
[ ] 用于表示字符域 ( ) 用于确定作用符的作用对象 {N, M}
A-Z用于指定匹配的次数介于N,M之间
此时还可以用连字符表示字符范围^ 在其作用域内的字符组合,需要出现在被匹配对象开头
如果该字符出现在匹配组内,则表示排除字符$ 在其作用域内的字符组合,需要出现在被匹配对象结尾
位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式,如果需要匹配的模式中含有大量“/”符号,则使用“#”取代之,此时不必对模式中的“/”进行转义。例如
/love/
#
所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
+ | 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=(?
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个元素,剩余的部分都写到最哦户一个数组元素中。 |
这是一个用于验证电子邮件的正则表达式。但它并不是高效、完美的解决方案。在此不推荐使用。
Php代码
点击(此处)折叠或打开
为了更加有效验证电子邮件地址,推荐使用。
Php代码
点击(此处)折叠或打开