说来惭愧,作前端快三年对于正则表达式的应用仍是很浅薄,你们都知道正则的速度基本上是最快的,但就是懒得去记那些语法和规则,此次项目中屡次用到了须要匹配替换的动做,终于下定决心去研究一下了。前端
对象字面量正则表达式
/pattern/attributes函数
正则对象由这两部分构成pattern(匹配规则)+attributes(修饰符)学习
var reg = /\bis\b/
这样就成功的实例化一个正则表达式对象,接着咱们去应用它spa
字符串的replace函数接受两个参数,第一个参数能够是字符串或者正则表达式,第二个参数是须要替换的字符串,这样咱们就成功把小写的’is‘替换成了大写的’IS‘
好多同窗看那一串符号又开始头晕了,别急,听我慢慢道来prototype
咱们先来拆解这个正则表达式
首先开头结尾的//是必须的,而后是两个’b‘,表明着单词的开头或结尾,也就是单词的分界处,最后中间的is是须要匹配的字符串。连起来意思就是匹配字符串中的is,而且先后必需要有分界,也就是说’isisisisis‘这里的is不能替换成’ISISISISIS‘
好了,有同窗会问,为何句子中的第二个’is‘没有被替换,为何咱们没看到所谓的那个修饰符。咱们再改写一下这个正则对象3d
发现多了一个修饰符g,表明全局(globle)搜索,这样就能够匹配字符串中的全部的’is‘code
构造函数对象
var reg = new RegExp(pattern,attributes)blog
var reg = new RegExp('\\bis\\b','g') === var reg = /\bis\b/g
这里须要解释下为何一样的匹配规则却多了两个\
那是由于在js语法中,\须要转义,因此在这里的构造函数参数中须要把\转义
g--globe
这个在以前的例子中你们已经见识过了,就是全局搜索,默认匹配到第一个就会中止
i--ignore case
忽略大小写,默认大小写敏感
m--multiple lines
多行搜索
元字符
正则表达式有两种基本字符类型组成--原义文本字符和元字符
原义文本字符:字母数字这种无需转义的字符
元字符:在正则表达式中有特殊含义的非字母字符
* + ? $ ^ . | \ () {} []
字符类
咱们能够用元字符[]来构造简单的类
好比说:[abc]就把abc三个字母归为了一类,表达式能够匹配这一类字符
字符类取反
使用元字符^表示不属于建立的类中的字符
范围类
若是要是利用字符类匹配26个英文字母难道要一一写出来么,哈哈哈,too young too simple
使用范围类[a-z]匹配全部的26个英文字母,相加匹配条件就直接加在[]里面。
好比说[a-zA-Z0-9]匹配大小写的英文字母和0-9的数字
预约义类
看一个例子:匹配ab+数字+任意字符的字符串
在学习预约义类以前咱们的写法是
ab[0-9][^/n/r]
如今咱们学习了预约义类以后就能够这样
ab\d.
边界
这里的单词边界在最先的例子中咱们已经见识过了,如今咱们对比一下b和B的区别
^和$的用法
须要注意的是^和$在正则中的位置
量词
若是咱们须要匹配连续出现100次数字的字符串难道要写100个\b
吧
伟大的js语言固然不会这么傻了,这不引入了量词的概念么
这一次的例子咱们结合接下来的概念一块儿理解
这个例子中咱们把0-9这九个数字先是用{3,6}来全局匹配,发现匹配出两个NB
我来解释一下,正则表达式默认是贪婪模式匹配,即在量词范围中取最大的那个来匹配,因此第一个才会出现两个NB,1-6匹配一个NB,7-9匹配一个NB。而第二个匹配范围是{3,7},结果是NB89,由于最大值是7,因此1-7匹配成NB,而剩下的8,9达不到3个,因此没有匹配成功
这个非贪婪模式和贪婪模式相反,即取最小值来匹配,用法是在量词后面加?。
正确设置匹配模式对于处理复杂的正则是颇有益处的
如今有这样的需求,匹配wensnb这个字符串出现三次,是否是有的同窗会说
wensnb{3}
这样固然是错啦,由于只会匹配b出现三次,这时候就须要分组的概念
()能够起到分组的效果
或
用 | 表示或,下面的例子展现或在分组中的应用
()把nb和123分组,而且用|表示二者取其一
反向引用
利用$进行分组中的引用,分别把分组中的内容对应$1....$n
忽略引用
并非全部的分组咱们都但愿引用,用?:来忽略引用
咱们把上个例子中的第二个引用忽略,因此引用个数由3变成2个,所以找不到$3
原来对应$3的24如今变成了$2,而$1不变
你们听这个名字前瞻就知道必定有一个后顾和他对应,说的没错,只不过在js语法中的正则不支持后顾,因此咱们只关注前瞻就够了
咱们先来定义“前”:
在正则表达式中匹配是由文本头部到尾部(左到右),因此这个“前”表明的是文本的尾部
下面来定义前瞻:
正则表达式匹配到规则时再向前检查是否符合断言或者不符合断言(也是正则)
正向和负向前瞻的区别就是匹配到正则以后是否符合断言,符合断言称为正向前瞻,不符合就是负向前瞻
下面来看一个例子
在这个正向前瞻中,匹配一个单词字符(w不只表明单词,还表明数字下划线)而且前面的还要符合数字1-3这个断言才行,所以咱们把w e n这三个字符匹配到了
属性
在文章的开始咱们介绍了修饰符globle,ignoreCase,multilines 其实这个都是正则表达式的属性,而且有两个咱们没有说lastIndex和source 这五个属性都是只读,不能修改
方法
RegExp.prototype.test(str) //匹配传入的字符串符不符合正则规则(true or false)
RegExp.prototype.exec(str)