前言:
一开始我是拒绝学正则表达式的,暑假看慕课上的PHP进阶课程里有一章是专门讲正则,然后我思考的几秒钟,就略过了。理由和大家一样,畏惧,听很多人说正则很难,然后就果断放弃。但是昨天看到知乎上有个话题,问大家为什么不喜欢正则,然后看到下面很多大神说正则处理字符串很有用,很有用,很有用,甚至有人说正则很有趣! 好吧,既然有用的东西,就一定要学,一定要学,一定要学!想当年我学微观经济这门课都是拒绝的,头疼的,但是后来期末备考却发现它的乐趣。所以,任何事情,只要用心投入,一定会收获到乐趣。
什么是RegExp?
描述字符串规则的表达式。
语法
- 直接量语法:/pattern/attrs
- 创建对象的语法:new RegExp(pattern,attrs)
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 attributes 是一个可选的字符串,包含属性 "g"表示全局匹配,"i" 表示不区分大小写的匹配。
RegExp 对象方法
regexpObj.test(str)
测定正则表达式与指定字符串是否匹配。只要指定字符串中包含正则表达式,则返回true,否则返回false。
regexpObj.exec(str)
更强大的搜索,更详尽的结果:index,过程的状态:lastindex
锚点
用来匹配一个位置。
- ^ 表示起始位置
- $表示结尾位置
- 表示单词边界
字符类
匹配一类字符中的一个
- [abc] 表示a或b或c
- [0-9] 表示0到9中的任何一个数字
- [^0-9] 表示非数字的一个字符,这里的^ 表示非的意思
- [a-z] 表示a到z中任何一个字母
- . 表示任何一个字符(换行除外)
元字符
具有特殊意义的字符
- d 等价于[0-9],表示查找数字
- D 等价于[^d],表示查找非数字
- s表示查找空白字符,空白符指的不只是按下空格键在屏幕上显示的空格字符,还包括制表符,换行和回车符。
- S等价于[^s],表示查找非空白字符
- w等价于[A-Za-z0-9],表示查找单词字符
- W等价于[^w],表示查找非单词字符
量词
表示出现的次数
- {m,n}表示m到n次
- * 表示{0,} 即0到任意次
- ? 表示{0,1} 即0或者1次
- + 表示{1,...} 即1到任意次
例子:
/^1d{10}$/ 表示匹配一个以1开头,一共有11个数字的字符串
转义符
需要匹配的字符是特殊字符,所以需要转义一下啦
例子:
/@163.com$/ 表示匹配一个以@163.com结束的字符串,其中.是特殊字符,需要转义
多选分支
或用|表示
例子:
/b(a|e)d/ ===/b[ae]d/ 表示匹配bad或者bed
/.(png|jpg|gif|jpeg)$/ 表示匹配图片格式
字符类是一种特殊的多选分支
捕获
保存匹配到的字符串,以便日后再用。
()表示捕获
(?:)表示不捕获
支持正则表达式的 String 对象的方法
str.match(regexp)
获取匹配的字符串
str.replace(regexp/substr,replacement)
替换与正则表达式匹配的子串。
btw:
- 正则表达式的匹配只做一次,因此需要用到属性g表示全局模式。
- 正则表达式中,量词的惰性与贪婪模式的区别?