RegExp 是正则表达式的缩写。javascript
正则表达式( regular expression)描述了一种字符串匹配的模式。能够用来:java
(1)检查一个串中是否含有符合某个规则的子串,而且能够获得这个子串;正则表达式
(2)根据匹配规则对字符串进行灵活的替换操做express
正则表达式在线测试网站,https://regexper.com/ 数组
经过该网站,能够经过图形化的界面去领会正则表达式的含义,将更加直观和容易理解函数
RegExp对象:测试
JavaScript经过内置对象RegExp来支持正则表达式网站
有两种方法实例化RegExp对象:spa
一、字面量 :如 var reg = /\bis\b/g;prototype
二、构造函数 : 如 var reg = new RegExp('\\bis\\b','g');
修饰符: g:global全文搜索,不添加,搜索到第一个匹配就中止
i:ignore case忽略大小写,默认大小写敏感
m:multiple lines 多行搜索
正则表达式主要有一下两种字符组成:
一、原义文本字符(普通字符):
字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是"普通字符"表达式中的普通字符。在匹配一个字符串的时候,匹配与之相同一个字符 如:a,b,
二、元字符:
指的是在正则表达式中具备特殊含义的非字母字符(转义字符) ,如\n换行符 \t水平制表符 \v垂直制表符 \r回车符 \o空字符 \f换页符 \cX与X对应的控制字符(ctrl+x)
特殊元字符:. * + $ ^| \(){}[]
字符类:
使用元字符[]来构建的一个简单类,所谓类是指符合某些特性的对象,一个泛指,而不是特质某一个字符,如:[abc]把字符a、b、c归为一类,表达式能够匹配这些字符
[abc]
范围类:
可使用[a-z]来链接两个字符,表示从a到z的任意字符,这是个闭区间,包含了a和z字符
在[]组成的类内部是能够连写的,好比[a-zA-Z]
预约义类和边界:
匹配一个ab+数字+任意字符 的字符串 如:ab[0-9][^\r\n]
正则表达式提供了几个经常使用的边界表达式,如图
注意:^放在[]里面,就表示除xxx字符以外,放在外面则表示以xxx开始
量词:
若是但愿一个连续出现20次的数字字符串,能够采起这种形式 \d{20}
\d{20}\w\d?\w+\d*\d{3}\w{3,5}\d{3,}
贪婪模式和非贪婪模式:
贪婪模式:\d{3,6} ,尽量多的匹配
非贪婪模式:让正则表达式尽量少的匹配,也就是说一旦成功匹配了就再也不尝试,在后面加个?号便可
分组:
配置字符串Byron连续出现3次的场景,
Byron{3} 实际效果:
() 圆括号: 能够达到分组的功能,使量词做用于分组
|或:使用|能够达到或的效果 Byron | Casper
也能够这样结合分组使用 Byr(on|Ca)sper
选择出来的是符合Byronsper或者ByronCasper
反向引用
将2015-12-25 =>12/25/2015
前瞻:
正则表达式从文本头部向尾部开始解析,文本尾部方向,称为‘前’
前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾/后瞻方向相反
javascript不支持后顾
符合和不符合特定断言称为确定/正向匹配和否认/负向匹配
\w(?=\d)
\w(?!\d)
分析:从第一个字符'a'开始,知足\w,后跟'2',符合断言'\d’,所以a被X所替换
分析同上
对象属性:
global全文搜索,不添加,搜索到第一个匹配就中止 默认值false
ignore case忽略大小写,默认大小写敏感 默认值false
multiple lines 多行搜索 ,默认值false
lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置
source:正则表达式的文本字符串
这几个属性都是只读的,不能手动设置
RegExp的test和exec方法:
RegExp.prototype.test(str) :
用于测试字符串参数中是否存在匹配正则表达式模式的字符串
若是存在,返回true,不然返回false
给其加上g后,判断ab是存在匹配该模式的字符, ,从结果看来,当执行到第三次,结果变成了false,实际上是lastIndex这个属性在做用,缘由在于正则表达式执行了test方法后都会做用到正则表达式自己的结果。
,能够看到执行两次后,lastIndex的值变为了2
分析:当前匹配结果,就是a,当前匹配结果的最后一个结果,仍是a,当前匹配结果的最后一个结果的下一个结果,那就是b,此时lastIndex的值就是1了。那么在执行一次,lastIndex的结果就是2,看来test方法执行,其lastIndex并非每次都是从头开始的,那么第3次执行的时候,lastIndex就被重置为0了。
若是测试的是reg1.test('a');那么其返回的结果,只有奇数次是true。由于咱们用test的方法时候,只是为了测试是否存在某个字符而已,所以就没有必要加上g标志了。
RegExp.prototype.exec(str)
使用正则表达式模式对字符串执行搜索,并更新全局RegExp对象的属性以反应匹配结果
若是没有匹配的文本则返回null,不然返回一个结果数组
-index 声明匹配文本的第一个字符的位置
-input 存放被检索的字符串String
非全局调用:
*调用非全局的RegExp对象的exec()时,返回数组
*第一个元素是与正则表达式相匹配的文本
*第二个元素是与RegExpObject的第一个子表达式相匹配的文本(若是有的话)
*第三个元素是与RegExp对象的第二个子表达式相匹配的文本(若是有的话,依次类推)
注意了:在非全局的状况下,lastIndex根本就不生效
以上是非全局和全局调用的结果
字符串对象方法:
String.prototype.search(reg)
*search()方法用于检索字符串中指定子字符串,或检索与正则表达式相匹配的子字符串
*方法返回第一个匹配结果 index,查找不到返回-1
*search()方法不执行全局匹配,它将忽略标志g,而且老是从字符串的开始进行检索
‘a1b2c3’.search('1');返回1,会将其转换成正则表达式 ‘a1b2c3’.search(/1/);返回1,若是传入的参数不是正则,则会尝试转换成正则表达式
String.prototype.match(reg)
非全局调用:
若是regexp没有标志g,那么match()方法就只能在字符串中执行一次匹配
若是没有找到任何文本,将返回null
不然它将返回一个数组,其中存放了与它找到的匹配文本有关的信息
返回数据的第一个元素存放的是匹配文本,而其他的元素存放的是与正则表达式的子表达式(如分组)匹配的文本
除了常规的数组元素以外,返回的数组还含有2个对象属性
-index 声明匹配文本的起始字符在字符串中的位置
-input声明对stringObject的引用
全局调用:
若是regexp具备标志g,则match方法将执行全局搜索,找到字符串中全部匹配子字符串
*没有找到任何匹配的子串,则返回null
*若是找到了一个或多个匹配子串,则返回一个数组
数组元素中存放的是字符串中全部匹配子串,并且也没有index属性或input属性
以上是非全局和全局调用结果,非全局下,lastIndex不起做用,其ret中的a是分组的字符。在全局条件下ret的结果为1a2,3c4
Sting.propotype.split(reg)
咱们常用split方法把字符串分割为字符数组
'a1b2c3d4e5',split(/\d/);
String.prototype.replace()
'a1b1c1'.replace('1',2) -->‘a2b1c1’,并非指望
‘a1b1c1’.replace(/1/g,2)-->'a2b2c2'
三种参数:
replace(str,replaceStr);
replace(reg,replaceStr);
replace(reg,function); //处理更加复杂的替换结果
采用第三种,用function的返回值做为替换结果,function会在每次匹配替换结果的时候执行四个参数
一、匹配字符串
二、正则表达式分组内容,没有分组则没有参数
三、匹配项在字符串中的index下标
四、原字符串
将'a1b2c3d4e5' ---> 'a2b3c4d5e6'
从上看到,两次匹配的结果分别是 1b2 和 2d4,因为分组后,只对group1和group3保留,去掉group2,所以1b2-->12 3d4-->34,最终替换的结果就是a12c34e5