正则表达式
what:规定一个字符串中字符出现规律的表达式
when:只要使用一种规则,模糊匹配关键词时
how:
1.最简单的正则就是关键词原文
2.字符集:规定字符串中某一位字符,备选字符列表
when:只有一位字符,有多重选择字符时
how: [备选字符列表]
注意:
1、每个字符集只能匹配一位字符
2、每个字符集 至少匹配一次
简写:
1.如果备选字符集列列表是连续的,可以用-省略中间字符
ex:
一位数字:[0123456789] [0-9]
一位小写字母:[a-z]
一位大写字母:[A-Z]
一位字母:[A-Za-z]
一位汉字:[\u4e00-\u9fa5]
特殊:除了xxx以外[^xxx]
^必须写在[^开头]
常用字符集的简写:预定义字符集 固定4个
\w 一位字母数字或_ ==>[a-zA-Z0-9_]
\d 一位数字 ==>[0-9] digtal---数位
\s 一位空字符:一切看不见的字符
. 任意字符
量词:专门规定一个位字符集出现次数的规则,量词需放在字符的后面
1.有明确数量边界:
字符集{min,max} 规定字符集最少出现min次,最多出现max次
字符集{min,} 规定最少min次,多了不限制
字符集{n} 规定必须出现n次
2.没有 明确数量边界
字符集? 可有可无,最多一次
字符集* 可有可无,多了不限
字符集+ {1,}至少一次,多了不限制
注意:仅修饰相邻的前一个字符集
选择和分组
分组:把多个规则组成的正则表达式用(括起来)
选择:就是“或者”
//作业: 手机号、邮箱
思路:
(\+86|0086)? +86或0086 可有可无,最多一次
\s* 空字符,可有可无,多了不限制
1
[34578] 在 3,4,5,7,8中挑一个
\d{9} 9位数字
(\+86|0086)?\s*1[34578]\d{9} 手机号码
邮箱 y@qq.com.cn
数字 字母 或者_ 一次以上
@
字母或数字 两位以上
(. 和 字母或者数字 2-3位 ) 1-2次
\w+@[a-zA-Z0-9]{2,}(.[a-zA-Z0-9]{2,3}){1,2}
RegExp对象
1、what:封装一条正则表达式,提供了使用正则表达式进行查找和验证的API
2.when 查找关键词的第四种情况:即查内容,又查位置
利用正则表达式进行验证
3.how:
创建 直接量的创建 已知规则
var reg=/no/g; //所有与的/在正则中都要加上\/才能转义为/
console.log(typeof reg);//object 对象
动态创建正则
var reg1=new RegExp(/正则/,"gi");
var str = "床前明月光,一行白鹭上青天,日照香炉生紫烟,飞流直下三千尺";
var names=['明月','白鹭','飞流','紫烟',"青天"];
var nameReg = new RegExp(names.join("|"),"g");
var kws = str.match(nameReg);
console.log(kws);
2.找到所有关键词内容,又找到每个关键词的位置!
var arr = reg.exec(带查找的完整字符串)
返回值:本次找到的一个关键词及位置
arr[0]: 关键词的内容 如果正则中有分组 arr[n]:自动保存在第n个分组匹配的子内容
arr[index]: 当前关键词位置 – >等同于 arr.index 如果没有找到返回null
每次查找后,都将reg.lastIndex属性(下一次开始位置)修改为当前index+关键词长度,相当于跳过了当前关键词继续向后找
var str = "那天,我去她家,我说:我草 你家真大。她说一起去郊游,我草草的收拾了一下,她说:我去去就来";
var reg =/我[去草]{1,2}/g;
var arr;
//固定用法:找所有关键词
//反复:找str中的关键词,只要不等于null
while((arr=reg.exec(str))!=null){
console.log(arr);
console.log(
`在位置${arr["index"]}
发现
敏感词${arr[0]}`
);
}
3.检查字符串是是否完全满足正则表达式的要求!
var bool = reg.test(待检测字符串)
只要是验证,reg中必须前加^ 后加$ 要求冲头到位,都必须完整匹配,返回值位布尔类型。
判断字符串中是否包含符合正则的敏感词
String对象
.toString() 方法返回字符串。
4.var i = str.search(/正则/i)
** i表示忽略大小写 在str中找到第一个符合正则表达式要求的关键字的位置**
返回值:找到了返回关键词的下标,如果没有找到返回-1
var str=prompt("正在输入消息.....);
var i = str.search(/(微|w(ei)?)\s*(信|xin|x)/);
console.log(i==-1?"发送成功":"发现敏感词,不能发送!");*/
var str="No zuo no die No can no say";
var i =str.search(/n/i);
console.log(i);
indexOf("value") 方法可返回某个指定的字符串值在字符串中首次出现的位置。
-
使用正则表达式查询指定的一类关键词
var arr = str.match(/正则/ig) 查找str中所有符合正则表达式要求的关键词,保存在一个数组中返回
默认只找第一个,找到所有需要必须加上g
返回值:所有敏感词组成数组,没有找到返回nullvar arr = str.match(/we/gi); console.log(String(arr));
强调:如果一个api有可能返回null,就必须先做判断,不等null时在使用
6.查找关键字
.indexof : 默认从0开始,仅能查找一次出现的位置
var r=str.indexof(“关键字”,i)
i为从下标为i的位置查找下一个关键字
返回值:关键词具体的位置下标,没找到返回-1
7.替换:将字符串中所有敏感(符合正则表达式规则)词替换为新内容
基本替换 str = str.replace(/正则/ig,‘替换值’); 替换以后返回一个新的字符串
str = "青葡萄,紫葡萄,青葡萄没紫葡萄紫,吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮,若要不吃葡萄非吐皮,就得先吃葡萄不吐皮";
str2 = str.replace(/[吃]?葡萄/g,
function(kw){
return kw.length==2?"**":"***";}*/
kw => kw.length==2?"**":"***")//es6中的箭头函数
衍生操作:删除,将找到的字符串替换成空字符
str = str.replace(/葡萄/g,"");
格式化:将原字符串的关键词按照指定格式重新组合
step1: 用正则将元字符串中的内容分组
step2: 用replace按新格式重新组合各个分组的内容
ex:"19950415"--->1995年04月15日
birth.replace(/(\d{4})(\d{2})(\d{2})/g,"$1年$2月$3日")
其中$n可以获得第n个()分组对应的子字符组
回调函数:用你给定的条件,自动执行
console.log(str2);
var kwr = str.match(/no/gi);
var newStr = str.replace(/no/gi,'bu');
console.log(newStr);
console.log('共替换'+kwr.length+"处");
//yes
var reg=/yes/gi;
kwr=str.match(reg);
var unStr=str.replace(reg, "***");
console.log(unStr);
console.log(kwr==null?"没有找到匹配的关键词":"替换"+kwr.length+"处")
//高级用法:根据不同的关键词,动态替换不同的新值
str = str.replace(/正则/gi,function(kw){
kw本次找到的关键词
return 根据kw计算出新的替换前一个
})
8.切割:将源字符串,按照指定字符,分割为多个子字符串
var substr=str.split(/正则/)
var mail = "elyssa@qq.cn";
var result=mail.split(/@/); // ["elyssa ", "qq.cn"]
9.截取:提取字符串的某个部分,并以新的字符串返回被提取的部分。
slice()
str.slice(start,end)
start为开始截取元素的下标(如果只有开始下标,没有截取部分末尾下标,将默认为后面的元素全部截取)
end为末尾截取元素的下标(截取数组,不包括下标为end的元素)
返回值:一个新的字符串。包括字符串 stringObject 从 start 开始(包括 start)到 end 结束(不包括 end)为止的所有字符。
10 .抽取
.substr() 的参数指定的是子串的开始位置和长度
str.substr(start,length)
substr() 的参数指定的是子串的开始位置和长度,因此它可以替代 substring() 和 slice() 来使用但用法不同,length为截取的长度。**
返回值:一个新的字符串,包含从 str的 start(包括 start 所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从 start 到 str的结尾的字符。
Math对象 专门封装数据计算所用的常量,并且提供数学计算所用的API
只要数学结算
特点 不能 用new!创建 直接使用对象名.函数
console.log(Math.PI);
1.取整
Math.ceil(num); 上取整
var num=3.45;
console.log(Math.ceil(num));//4
Math.floor(num);下取整
console.log(Math.floor(num));//3
Math.round(num); 四舍五入 只能取整,不能规定小数位数,得到的是number类型
toFixed(d)可取整,省略参数就是取整,也可规定小数位数 返回string类型
console.log(Math.round(num));
console.log(num.toFixed(2))
2.乘方 和平方
Math.pow(底数,幂) 乘方
console.log(Math.pow(2,8));//256
Math.sqrt(n) 开平方
console.log(Math.sqrt(9));
3.随机数
Math.random(); 返回一个0-1之间的小数
从min~max 之间取随机整数
Math.floor((Math.random()*(max-min+1)+min));
从0~n之间取随机数
Math.floor(Math.random()*(n+1));