正则表达式浅谈
我们知道js很擅长处理数组,例如forEach,map,reduce,filter....面对各种情况都有原生对应专门的方法提供选择~~
但是印象中字符串好像方法就没有数组这么丰富了,其实js提供的操作字符串的方法也不少,只是我们用得少罢了,为什么呢?因为我们有强大的正则表达式,可以匹配任何你想匹配的字符串形式,匹配字符串正则就够了~
ps:正则表达式这个名称其实在台湾,被翻译成规则表达式,本人认为这个比较合理~~
首先,我们先温习下,操作字符串的几个最常用的方法:
1.search/indexOf
'abcdef,dc'.indexOf('dc'); // 'abcdef,dc'.search('dc'); // 'abcdef,dc'.search(/dc/); //
其实两种方法都是一样的用法,就是返回要查找的字符的索引位置,不同的是:indexOf只接受字符串,而search既接受字符串又接受正则表达式
2.substring
'abcdef,dc'.substring(2,5); //"cde" 'abcdef,dc'.substring(2); //"cdef,dc"
substring就是传入开始和结束的索引,然后截取字符串的一部分返回,如果只传一个参数,就默认这个参数往后的所有返回,能实现这个功能的方法还有slice和substr,之前为了区分这几个类似的方法搞到弄得自己对任何一个都不熟悉了,所以建议了解substring就够了,因为它们三个实在差不多。
3.charAt
'abcdefg'.charAt(3); //"d"
charAt就是返回对应索引的单个字符
4.split
"a|b|c|d".split('|'); //[a,b,c,d]
split不用多说,就是把字符串分割成数组
其实不学正则我们凭借这几个方法就可以实现99%字符串的操作了,因为我们可以遍历这个字符串来实现任何我们想做的事:
let str = "....~!!!!$#@!!@#!@#"; Array.from('abcdef,dc').forEach(item=>{ if(item=='.....') //...... })
RegExp对象
就像Array一样,平常很少见到,因为大家都喜欢直接写let arr = [1,2,3,4],不愿意写let arr = new Array(1,2,3,4);
RegExp也是一样,大家都愿意写let reg = /abc/gi,不愿意写let reg = new RegExp('abc','gi')
和js正则表达式最相关的操作方法有search、replace、match,还有一个特别的test
search前面也说过了,返回的是匹配到的index
replace就是取代正则匹配到的部分
match就是返回一个数组,里面存这匹配到的所有结果
Test测试字符串是否符合正则,字符串一部分符合就会返回true,所以我们通常加上^$
let reg = /^\w+@[a-z0-9]+\.[a-z]+$/i; reg.test('[email protected]'); //true reg.test('#$#[email protected]'); //false
1.正则里面的[],表示范围和范围排除
/[a-zA-Z]/ //意思是所有字母 /[^a-zA-Z]/ //意思是字母以外的所有字符
2.正则里面的{},表示量词
- {n} ————
- {n,m} ————
- {n,} ————
- + ———— 1次或多次(就是{1,})
- ? ———— 0或1次(就是{0,1})
- . ———— 0或多次(就是{0,})不建议使用,因为太容易出错,基本没有地方是必须用到它的
3.正则里面的常用的转义:
- . ———— 任意字符(不包括换行符)不建议使用,因为太容易出错,建议用范围排除来代替,如果你用到了它,说明你没有考虑清楚
- \d ———— 任意数字(就是[0-9])
- \w———— 字母数字下划线(就是[a-zA-Z0-9_])
- \s ———— 空白符
- \D———— 非数字(就是[^0-9])
- \w———— 非字母数字下划线(就是[^a-zA-Z0-9_])
- \S————非空白符