最近入了正则的坑,一发不可收拾,有些入魔,挺有意思,网上的资料很多,良莠不齐,官方文档又写的生硬,我自己啃了好久,总结了一些干货,这个系列会有几篇文章,基于通用正则和PHP语法来做的,也会引用一些我觉得好的文章。
正则这个词有点儿晦涩?这个词是英文翻译过来的,英文原文是regular expression直译的意思是“有规则的表达式”,英文简称RE,中文简称正则。
其实我们每个人都用过正则,那就是我们的搜索功能,你输入想匹配的关键字,比如AV,这个就是规则regulation,电脑按照这个规则,给你搜索出匹配match你关键字的信息或文件,这就是正则最核心的功能和工作模式,第一节课讲完了,同学们下课!
好的,到这里能听懂的,我们继续。为什么要学习正则?
因为通过正则,我们可以快速简单的实现3个目的:
- 数据校验。比如你的密码必须包含8位数字或英文字母,验证输入的身份证号码是否符合规范等等。如果没有正则,难道一位一位的去循环校验么?!
- 数据搜索并操作。比如可以使用正则表达式来找到指定的标题或者文本,然后你就可以对它为所欲为,进行提取,替换,删除,修改等等。
- 应用规则生成符合规则的字符串。这是正则的反向应用。比如我们经常会遇到的验证码,和随机密码等等。你认为的随机,其实都有规则。
我习惯把正则表达式所描述的规则叫“特征”,我觉得这个表述更准确一些。OK,明白了正则的目的,我们再说使用正则的几个基本规则:
- 特征的匹配顺序:从左到右。有两层意思,一个是正则表达式从左到右进行读取和匹配,一个是目标字符串从左到右读取并匹配,如果匹配上了就返回匹配值,如果没有匹配上,就继续向右直到目标字符串结束。
- 还是顺序,在分支结构中,一定要把规则更复杂的写在前面。因为从左到右的匹配特性,导致你在写正则时,如果允许2个或以上匹配特征,且这两个特征很类似的情况下,一定要把规则更复杂的写在前面,否则会无法匹配。举个列子:美国邮编可以是5位数字,也可以是5位数字+4位可选数字,如果你将5位数字写在前面的话,会导致无法返回5位数字+4位可选数字的情况!
- 贪婪Greed:这里的贪婪有广义和狭义两层意思。先说狭义,首先默认情况下,正则表达式会根据你所定义的特征,去匹配最多的字符,比如\d+表示任意数字重复1次或n次,目标字符串是335522555,那么他会返回整个字符串,而不是3,可以通过在量词后面加?来取消贪婪模式,\d*?返回的就只是3,这个是狭义贪婪的示范. 但是有时即便取消了贪婪模式,但系统仍然会根据你指定的特征去进行最大匹配,这个就是广义上的贪婪,这个是无法取消的,这个例子咱们之后讲。
- 正则表达式默认区分大小写,如果想要取消,可以通过/i或(?i)的方式取消,这个和特征修饰符有关.
- 正则表达式默认识别空格,所以如果误输入了空格会导致匹配失败,可以通过/x来规避这个问题.
- 表达式开头和结尾必须有分隔符,分隔符可以自定义,且分隔符如果在表达式当中出现都会被认为是有特殊意义的,如果要进行字符匹配,必须在前面加反斜线\进行转义,我推荐的分隔符是@和~.
- 匹配字符串的时候,系统默认目标字符串是单行的,如果你要匹配多行字符串,需要通过特征修饰符/m,否则匹配不完整。
好了,第二节课讲完!先对这些规则有个印象,在实践中慢慢体会。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。