正则在JS中 是一种专门用来处理字符串的 类;可以理解成字符串的规则;正则只能用来处理字符串
编写正则有两种:字面量 构造函数
正则的组成部分:元字符 修饰符
元字符分为:特殊元字符 量词元字符 普通元字符
正则处理字符串:匹配(字符串满不满足正则的条件)test 捕获(把满组正则条件的字符获取到)exec,正则的 lastIndex 属性 是 定义了 下一次捕获开始的位置
常用的有特殊含义的元字符
\ 代表转义
. 代表除了换行之外的所有字符
\d 代表0-9之间的数字
\w 代表数字 字母 下划线
^ 代表以什么开头
$ 代表以什么结尾
[ab] 代表a或b
[a-z] 代表a到z 也就是小写字母
[^ab] 代表除了a和b
[^a-z] 代表除了小写字母
a|b 代表a或b
() 代表分组,捕获时常用,在匹配是可以提升优先级
(?:) 只匹配 不捕获
(?=) 只匹配 不捕获 正向预查
(?!) 只匹配 不捕获 负向预查
量词元字符 使用在对应的元字符的后边
? 代表对应的字符出现0或1次
* 代表对应的字符出现0或多次
+ 代表对应的字符出现1或多次
{n} 代表对应的字符出现n次
{n,m} 代表对应的字符出现n到m次
{n,} 代表对应的字符至少出现n次
修饰符 用在两个斜杠的后边
i 忽略大小写
m 多行匹配
g 全局匹配
验证有效数字
整数 负数 小数
/^[-+]?(([1-9]\d*)|0)(\.\d+)?$/
验证手机号码
数字1开头 第二位是3|5|6|7|8|9 共11位
/^1[356789]\d{9}$/
验证QQ邮箱的正则
前面是QQ号码 后面是@qq.com
/^[1-9]\d{4,10}@qq\.com$/
验证身份证号码
共18位 最后一位可能是X
/^[1-9]\d{5}\d{4}\d{2}\d{2}\d{2}\d(\d|X)$/
验证密码
6-16位 是数字 字母下划线
/^\w{6,16}$/
自己封装一个 execAll的方法 可以 一次性把所有的符合条件的内容捕获到
RegExp.prototype.execAll = function (str='') {
// 首先查看对应的正则有没有 修饰符 g
if(!this.global){
// 代表正则没有修饰符g
throw new Error('您的正则没有修饰符g 不能使用该方法')
return;
}
// 怎么保证str是字符串?
str = str.toString();
// this ---> reg2
var res = this.exec(str);
var ary = [];
while(res){
ary.push(res);
res = this.exec(str);// 每次while循环都要更新res;
}
return ary
}
封装一个getCookie的方法 使用 execAll getCookie位于 字符串的原型上
String.prototype.getCookie = function(key){
var reg = /([^; ]+)=([^; ]+)/g;
var ary = reg.execAll(this);
// 把数组ary中的每一项 转成对象的格式
var obj = {};
ary.forEach(item=>{
// item 数组中的每一项; 都是一个小数组
obj(item[1])
= item[2]
})
return key ? obj[key] : obj
}
贪婪性和懒惰性
-
懒惰性 找到一次符合规则的字符串之后 就不再向后捕获了
-
怎么解决懒惰行 ?? 修饰符g
-
贪婪性 一次把所有符合条件的都拿到
-
怎么解决贪婪性 ?? 对应元字符的末尾加一个?
-
懒惰性就是只获取一次,贪婪性就是 一次尽量多的获取;
match
返回数组 match 是字符串的方法,当正则不加全局修饰符的时候; 效果跟 exec 是一样的 但是加上全局修饰符g之后,match只会捕获到所有的大正则匹配的内容 match(有g的时候)的 优点是把大正则的内容全部捕获到 缺点是不能捕获小分组
replace
-
replace 的两种用法 在于第二个参数可以是字符串 也可以是 回调函数
-
若是字符串 则表达的含义就是 用该字符串去替换 当前正则匹配到的内容
-
若是函数 则表达的含义就是 用该回调函数的返回值 去替换当前正则匹配到的内容的两种用法 在于第二个参数可以是字符串 也可以是 回调函数
-
若是字符串 则表达的含义就是 用该字符串去替换 当前正则匹配到的内容
-
若是函数 则表达的含义就是 用该回调函数的返回值 去替换当前正则匹配到的内容
使用 replace方法 去 实现 getParam 方法 比match的优势 即使有g 也能实现小分组的捕获
function getParam(str){
var obj = {};
str.replace(/([^?=&]+)=([^?=&]+)/g,function(a,b,c){
obj[b]=c
})
//箭头函数写法 str.replace(/([^?=&]+)=([^?=&]+)/g,(a,b,c)=>obj[b]=c)
return obj;
}
千分符
第一种方法
var str = '1234345345';
var s = ''
for(var i = 0 ; i < str.length; i++){
if(i%3==2){
s += str[i]+','
}else{
s += str[i]
}
}
第二种方法
var str = '1234345345';
str = str.split('').reverse().join('');// 字符串反转
var res = str.replace(/\d{3}/g,function(a){
return a+','
})
res = res.split('').reverse().join('');
第三种方法
var str = '1234345345';
var res = str.replace(/\d{1,3}(?=(\d{3})+$)/g,function(...arg){
return arg[0]+','
})