首先,我们先讨论一下什么是正则?为什么需要正则?正则能做哪些事情?
正则表达式实际上就是规定了一系列的字符串规则,例如说我们看到18788724827就能知道这是一个手机号,看到zifieyu@xx.com就知道这是一个邮箱。那么,我们怎么让计算机知道这一切呢?
我们人类之所以能分辨出来是因为我们心里有一个模型,我们知道十一位的数字很有可能就是一个手机号,@+邮箱品牌+.com的组合很有可能是一个邮箱。正则正式提供一种语法,让我们把自己心中的那种识别模式告诉计算机,让计算机能像我们人类一样去识别特定的字符串。好了话不多说,下面正式介绍一下正则的使用。
创建
正则也是一个js内置对象,所以可以通过new RegExp()的形式创建,也可以通过简写//的形式创建:
var re01 = new RegExp('a'); //这种形式创建,可以往正则中传入变量 var re02 = /a/; // 简写形式不可以传入变量,且不能加引号
方法test
re.test(str)方法是正则对象上的一个方法,接受一个字符串作为参数,如果字符串中有符合正则的部分,则返回true,反之则返回false。
var str = 'abcd'; var re = /a/; re.test(str) // true
方法search
str.search(re),查找字符串中是否有符合正则的部分,如果有,返回第一个匹配项的位置,否则返回-1;
var str = 'bbcasa'; var re = /a/; str.search(re) // 4
方法match
str.match(re),寻找字符串中符合正则的匹配项,并将这些匹配项以数组的形式返回,否则返回null。
var str = 'abcaadaefaa'; var re = /a+/g; // "+" 是一个量词表示出现一次或更多,"g"表示全局搜索,正则默认匹配到一个匹配项后就不会继续查找了。 str.match(re) // ["a", "aa", "a", "aa"]
方法replace
str.replace(re, newStr | callback) 该方法首先匹配字符串中符合正则的部分然后替换成newStr或者callback的返回值;这里的callback = function(str,str1,str2…){return res},参数str表示匹配到的匹配项,str1,str2…分别表示正则匹配项中的第一个,第二个子项。关于什么是子项,后面我们会详细介绍。
var str = "我爱吃饭,我爱睡觉,我爱打豆豆"; var re = /(吃饭)|(睡觉)|(打豆豆)/g ; str.replace(re, (...grv) => { var res = []; res = grv[0].split("").map(() => {return "*"}).join("") return res })
上面的例子中,我们过滤了某些词语,并且将其替换成**号,相信,大家在玩游戏的时候深有体会,打了半天字,发出去的没有几个!
默认行为
正则表达式中默认是区分大小写的,不过可以通过在末尾加上i来关闭这一默认行为
var re=/AbvR/i;
找到第一个匹配项就会结束查找,通过在末尾加g可以使得正则变成全局匹配模式
var re=/as/b;
正则中的小括号
分组操作:小括号内的部分作为一个整体进行操作,请看下面的例子
var str = '2017-8-12' var re01 = /\d-+/g var re02 = /(\d-)+/g str.match(re01) // ['7-', '8-'] str.match(re02) // ['7-8-']
匹配子项:整个正则匹配到的匹配项我们暂且成为父项,然后就容易理解,被小括号括起来的各个部分就是父项下面的一个一个的子项。
var str = '2017-8-12' var re = /(\d+)(-)/g str.replace(re, ($0, $1, $2) => { console.log($0, $1, $2) return $1 + "." }) // 2017- 2017 -; 8- 8 -; 2017.8.12
match()方法在不加g的情况下,在返回的数组中会展开所有子项;
var str = 'abc' var re = /(a)(b)(c)/ str.match(re) // ['abc', 'a', 'b', 'c']
正则中的中括号
字符类:一组相似的字符,[abc]整体代表一个字符,内部为或的关系。
- [^abc]:代表一位,单不能是a,b,c
- [a-z]: 代表一个范围(从小到大),整体代表一位;
- [a-z]+: 一位或多位
正则中的大括号
大括号用来表示量词
- {4, 7}: 4-7次
- {4,}:最少4次
- {4}:正好4次
- {1,} 相当于+
- ?相当于{0,1}
- *相当于{0,}
限制字符串的起始和结束
- ^: 写在正则的开头代表字符串的起始
- $:写在正则的结束代表字符串的结
re=/^\s*|\s*$/g //去掉收尾空格
正则中的转义字符
- 点“.”
正则中“.”表示任意字符
. 表示真正的点
多用于文件后缀名 - \d; \D
数字,非数字 - \w;\W
字符,非字符 - \s; \S
空格,非空格 - \b;\B
- 独立部分,非独立部分
- 独立部分是什么:
起始
结束
空格
- \1; \2; \3 …
重复第n个子项
目的:看下面两个例子有什么不同
var re = /\w\w/; ab,cd var re =/(\w)\1/; aa, bb
- 点“.”
实际开发环境
实际公司开发环境中,应该把正则都放到一个对象或者一个json中,方便统一管理,统一调配