07 JS CORE String API、正则表达式
正课:
1. ***String API
检索关键词:查找出字符串中包含的敏感词的位置和内容
替换
切割字符串
2. *****正则表达式:规定一个字符串中出现规律的表达式
1. 检索关键词: 4种
1. 查找一个固定的关键词出现的位置:
var i=str.indexOf("关键词",fromi)
在str中,从fromi位置开始查找"关键词"的位置
如果找到,返回关键词所在位置的下标
找不到,返回-1
简写: 省略fromi,默认从0开始
专门找最后一个关键词的位置:
var i=str.lastIndexOf("关键词")
在str中,找最后一个关键词出现的位置
问题: 只能找第一个关键词
解决: 正则表达式:
2. 使用正则表达式查找指定的一类关键词的位置:
按模式匹配:
var i=str.search(/正则表达式/);
如:var i=str.search(/(微|w(ei)?)\s*(信|x(in)?)/);
在str中查找第一个符合正则表达式要求的关键词的位置
返回值: 找到的关键词的下标, 如果找不到返回-1
何时: 仅判断是否包含敏感词时,就用search
如果返回不是-1,说明包含,否则说明没找到
正则默认仅匹配第一个
忽略大小写: /正则/i
问题: 1. 只能获得第一个的位置,不能获得所有敏感词
2. 只能返回位置,不能返回内容
3. 使用正则表达式查找指定的一类关键词的内容:
var arr=str.match(/正则/gi);
查找str中所有符合正则表达式要求的关键词,保存在一个数组中返回
默认只找第一个,找所有:/g;忽略大小写:/i;
返回值: 所有敏感词组成的数组
没找到返回null!
强调: 如果一个API有可能返回null,就必须先判断不是null,再使用!null的长度立即报错
arr.length 表示找到的关键词个数,
问题: 仅返回所有关键词的内容,无法返回每个关键词位置
4. 即找所有关键词内容,又找每个关键词的位置?
reg.exec();
***RegExp对象:
什么是: 封装一条正则表达式, 提供了使用正则表达式进行查找和验证的API
何时: 1. 查询关键词的第四种情况: 即查内容,又查位置
2. 利用正则表达式执行验证
如何:
创建: 2种:
1. 如果正则表达式是固定不变的: var reg=/正则/ig; /\d{2}!/=/\d{2}/
强调: /正则/中正则中的/都要转义为\/
2. 如果正则表达式是动态生成的:
var reg=new RegExp("正则","ig");
强调: "正则"中的" \ 都要转义为\" \\
比如: "\d{6}" => "\\d{6}" "==>\"
验证:检查输入的字符串是否符合正则表达式的要求
var bool=reg.test(str);
验证str是否满足reg的要求,满足返回true,否则返回false;
问题:默认只要str中部分满足reg的要求就返回true;
解决:前面加^,后面加$,完整匹配
2. 替换: 将字符串中所有敏感词替换为新内容
1、简单:所有关键词,都替换为统一的内容
基本替换:str=str.replace(/正则/gi,“替换值”);
2、高级:根据不同的关键词,动态替换不同的新值
str=str.replace(/正则/,function(kw){});
衍生操作:1、删除操作:将找到的字符用空字符代替
2、格式化:1.用正则将原字符串中的内容分组
2.用replace按新格式重新组合各个分组的内容($n可获得第n个()分组对应的子字符串)
3、切割: 将字符串按照指定的分隔符,分割为多个子字符串
var subs=str.split(/正则/);
比如:将邮箱地址切割为用户名和域名 var arr=str.split(/@/);
4. *****正则表达式:
什么是: 专门定义一类字符串统一规则的表达式
何时: 1. 按照指定规则模糊查找一类关键词时
2. 表单中验证输入项的格式
如何: 语法:
1. 最简单的正则其实就是关键词原文
2. 字符集: 规定字符串中一位字符可用的备选字符列表
何时: 只要某一位字符,有多个备选字时
如何: [备选字符列表]
强调: 1、一个字符集只能匹配一位字符
2、一个字符集至少匹配一个
简写: 如果备选字符列表是连续的,就可用-省略中间字符
一位小写字母:[a-z]
一位字母: [a-zA-Z]
一位数字: [0-9]
一位汉字: [\u4e00-\u9fa5]
特殊: 除了: [^排除的字符列表]
强调: ^必须写在[开头]
3. 预定义字符集: 4个:
\w 一位字母数字或_ =>[a-zA-Z0-9_]
\d 一位数字 => [0-9]
\s 一位空字符: 空格,Tab,...
. 一位任意字符
强调: 一个预定义字符集仅匹配一位字符
只有规则和预定义字符完全一致时,才能使用
如果不一致, 依然需要手写普通字符集
字符集仅控制每个字符的内容,无法规定字符出现的次数
4. 量词: 专门固定字符出现的次数
有明确数量边界:
字符集{min,max} 规定字符集必须最少出现min次,最多max次
字符集{min,} 最少min次, 多了不限
字符集{n} 必须n次
没有明确数量边界:
字符集? 可有可无,最多一次
字符集* 可有可无,多了不限
字符集+ {1,}
强调: 仅修改相邻的前一个字符集
5. 选择和分组:
分组: 将多个字符集分成一组:
何时: 如果希望一个量词同时修饰多个字符集时
比如: 我(了个?)?去: 我去 我了去 我了个去 我个去X
regexper.com
选择: 其实就是"或" 规则1|规则2
只要匹配任意一个规则即可
(微|w(ei)?)\s*(信|x(in)?)
6.匹配指定位置:
字符串开头:^ 比如:^\s+ 开头的空字符
字符串结尾:$ 比如:\s+$ 结尾的空字符
单词边界:\b \bno\b 不会找到nothing
手机号:
(\+86|0086)? +86或0086 可有可无,最多一次(\为转义字符)
\s* 空字符 可有可无,多了不限
1
[34578] 34578中挑一个
\d{9} 9位数字
(\+86|0086)?\s*1[34578]\d{9}
邮箱:
字母/数字或_ 一次以上
@
字母或数字 2位以上
(.和 字母或数字 2到3位) 1到2次
\[email protected][a-zA-Z0-9]{2,}(.[a-zA-Z0-9]{2,3}){1,2}
需求:微信 微 信 weixin wei xin wx w x
(微|w(ei)?)\s*(信|x(in)?)