1.正则表达式
概念:正则表达式就是一个表达式,匹配特殊字符或有特殊字符搭配原则的字符的最佳选择。
2.正则表达式定义的方式
1.var reg = /abc/;//字面量创建相当于和[]创建数组相同,直接创建
2.var reg = new RegExp('abc');使用构造函数创建,第一个参数是规则,第二个参数是属性,参数都写字符串形式的
使用new RegExp 和不使用new的区别在于:不new那么字面量的正则和创建的正则指向同一个人(返回的就是里面的正则表达式的引用) :使用new 那么就不是同一个人。
3.正则表达式使用方法
reg.test(str);测试正则表达式是否被包含在str里面
str.match(reg);字符串的方法,返回字符串匹配正则表达式的值,在不使用全局查找(g)的情况下找到一个就返回的
4. 特殊属性 i/g/m
g代表的是global全局匹配,但是如果多行的话只会匹配第一行
i代表ignoreCase忽略大小写,
m代表multiline多行匹配,
5.特殊字符
\ 转义字符
\n 换行
\r 行结束
\t 一个table(4个空格)
\空白 转义空白(换行)用使字符串换行使用
| 或
6.方括号表达式
[]中除-需要转义以外,其他字符都不需要,都能识别
一个[]代表一位,匹配[]中的任意一位
[^]^放在表达式里面就叫非,放外面叫以什么开头
[abc] 查找方括号内的任意一个字符
[^abc] 查找任何不在方括号内的字符
[0-9] 查找0-9之间的数字
[a-z] 查找任何小写字母
[A-Z] 查找任何大写字母
[A-z] 查找任何字母
(red|blue|green) 查找指定字符串(子表达式) | 这个叫或者的意思(ABC|bcd|abc)
()子表达式: /(a)\1/ : \1引用第一个子表达式的内容(反向引用)注意$1表示第一个子表达式的内容
使用该子表达式会把子表达式的内容匹配出来挂上,可以使用console.log(reg.exec(str))查看(str.match也是相同的,在不加g的情况下)
7.量词(代表数量的词)
以下均遵循贪婪匹配:
n+ 匹配任何包含至少一个n的字符(这个n可以出现1到无数次)(符合贪婪匹配原则)
n* 匹配任何包含0个或多个n的字符(这个n可以出现0到无数次)
var reg = /\w*/ var str = 'abc' str.match(reg) == ['abc', '']会多匹配一个逻辑上的空出来
如果reg = /\d*/ 那么看光标,几个光标几个空
n? 匹配任何0个或一个n的字符
n{X} 匹配X个n的序列字符串
n{X,Y} 匹配X至Y个n的序列字符串
n$ 匹配以n结尾的字符串
^n 匹配任何以n开头的字符串
?=n 正向肯定预查匹配任何后面紧接着指定字符串n的字符串
?!n 正向否定预查匹配任何其后没有紧接着指定字符串n的字符串
?<=n 反向肯定预查匹配任何前面紧跟着指定字符串n的字符串
?<!n 反向否定预查匹配任何前面没有紧接着指定字符串n的字符串
非贪婪匹配:
n+? n*? ...
补充
(?:n) 匹配时子表达式中没有这一项(不补获分组)
8.RegExp对象属性
global 查看RegExp对象是否具有g标志
ignoreCase 查看RegExp对象是否具有i标志
multiline 查看RegExp对象是否具有m标志
source 查看正则表达式源文本
lastIndex 一个整数标志开始下一次匹配的字符位置(一般与exec一起使用)
9.RegExp对象方法
compile 编译正则表达式。 (就是改变这个正则表达式)
exec(重要的方法) 检索字符串中指定的值。返回找到的值,并确定其位置。(如果属性不加g那么 lastIndex永远是第一位)
test 检索字符串中指定的值。返回 true 或 false。
10.字符串方法
search 检索正则表达式相匹配的值(返回匹配到的位置,中关心能不能匹配到,不关心能匹配多少个,所以加不加g都一样,匹配不到返回-1)
match 查找所有符合正则匹配条件的结果
replace(重要) 替换与正则表达式匹配的字符串(不写正则的时候只能替换一个,它没有访问全局的权利)
split 把字符串分割成数组(注: 用字表达式分割的话会保留子表达式)
11.相关面试题
-
正则表达式实现aabb的形式变成bbaa
var str = 'aabbccdd'; var reg = /(\w)\1(\w)\2/g; var str1 = str.replace(reg, function($, $1,$2) { return $2 + $2 + $1 + $1; }) console.log(str1); //bbaaddcc
-
给10000000000三位打点 变成 10.000.000.000
var str = '10000000000'; var reg = /(?=(\B)(\d{3})+$)/g; str.replace(reg, '.'); //10.000.000.000
-
字符串去重 aaaaaaaaaaaaaaaaaaaaaabbbbbbbbcccccccccc变成abc
var str = 'aaaaaaaaaaaaaaaaaaaaaabbbbbbbbcccccccccc'; var reg = /(\w)\1*(\w)\2*(\w)\3*/g; str.replace(reg, function($, $1, $2, $3){ return $1 + $2 + $3; }); //"abc"
-
把the-first-name转换成小驼峰式theFirstName
var str = 'the-first-name'; var reg =/-(\w)/g; str.replace(reg, function($, $1) { return $1.toUpperCase(); }) //theFirstName
-
匹配结尾的数字
//结尾是否为数字 var str = 'dkfdj1232'; var reg = /\d$/g; str.match(reg); //["2"] //首或者尾是否为数字 reg = /'^\d|\d$'/g //首尾都为数字 reg = /'^\d[\s\S]*\d$'/g
-
统一空格数
var str = ' fkjdf '; var reg = /\s+/g; str.replace(reg, ' ');//" fkjdf "
-
判断字符串是不是由数字构成
var str = 'fdjfd214234234'; var reg = /(\d*?:[a-zA-Z])/g; reg.test(str);// false
-
删除字符串中的空格
//删除前后空格 var str = ' d kdfjd dfjdkf '; var reg = /(^\s*)|(\s*)$/g; str.replace(reg, '');//"d kdfjd dfjdkf" //删除所有空格 var reg = /(\s*)/g; str.replace(reg, '');//"dkdfjddfjdkf"
-
身份证号匹配
var str = '12345678976543879X'; var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; //不需要全局匹配 reg.test(str);
-
邮箱地址验证
var str = '[email protected]'; var reg = /^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_-]+)+$/; reg.test(str);