正则表达式(RegExp):专门规定字符串中字符*格式规则*的表达式
1、最简单的正则:一个关键词的原文,就是最简单的正则,如ABC
2、修饰符
执行对大小写不敏感的匹配(无论大小写都会匹配) |
|
执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
3、字符集
①备选字符集:规定某*一位*字符可选的备选文字列表
语法:[备选字符列表]
强调:无论备选字符集中由有多少字符,都必须且只能选1个
一个[]只代表1位字符!
比如:3位数字:[0123456789][0123456789][0123456789]
② -:如果备选字符连续,可用-表示"到",比如:一位数字[0123456789]可以写成[0-9]
查找方括号之间的任何字符。 |
|
查找任何不在方括号之间的字符。 |
|
[0-9] |
查找任何从 0 至 9 的数字。 |
[a-z] |
查找任何从小写 a 到小写 z 的字符。 |
[A-Z] |
查找任何从大写 A 到大写 Z 的字符。 |
[A-z] |
查找任何从大写 A 到小写 z 的字符。 |
③ 预定义字符集:专门表示常用的连续的字符集
\d |
匹配一个数字字符。等价于[0-9]。(常用) |
匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。(常用) |
|
匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。(常用) |
|
匹配一个非数字字符。等价于[^0-9]。(了解) |
|
匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。(了解) |
|
匹配任何非空白字符。等价于[^ \f\n\r\t\v]。(了解) |
|
. |
匹配除了换行以外的其他所有字符 |
4. 量词:规定一个字符集出现的次数,用{}表示
①明确数量:3种:{min,max}:最少min位,最多max位
{min,}:至少min位
{n}:必须n位
②不确定数量:3种(常用)
? ==>{0,1}: 可有可无,最多1次
* ==>{0,}:可有可无,多了数量不限
+ ==>{1,}:至少一次,多了数量不限
例:二代身份证号:共18位字符,至少17位数字,最后一位数字或x X,
/d{17}[0-9xX]
例:手机号:+86或0086是中国大陆区号,在国外往国内打使用,可有可无,最多1次
空字符可有可无,多了数量不限
第一位:一定是1
第二位:从3,5,7,8选一个
其余9位:必须是9位数字
(\+86|0086)?\s*1[3578]\d{9}
+ * ?在正则中是量词,有特殊含义,要是字符串中需要的话要用转义字符,所以用”\+”
|代表或的意思,()?代表()中内容可有可无,最多1次,\s*代表空格符可有可无,数量不限
5、常用
转义符\ |
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”,而“\(”则匹配“(”。常见需要转义的:* + ?^ $ {} [] () / |
x|y |
匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。 |
[^xyz] |
负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。 |
[^a-z] |
负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。 |
定位符^ |
匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置 |
定位符$ |
匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 |
6、创建正则表达式2种:
①var reg=/正则表达式/ig; (常用)
何时使用:正则表达式在运行时不会改变
②var reg=new RegExp("正则表达式","ig");
何时使用:在运行时正则表达式可能被改变时
7、RegExp API
①格式验证
test():验证字符串的格式是否符合正则表达式的要求,要求从头到尾必须完整匹配!
var bool=reg.test(str)
问题:test方法默认只要部分匹配即可!
解决:都要在正则表达式前加^,后加$, ^和$联用表示从头到尾必须完整匹配
②查找:即能查找内容,又能查找位置
var arr=reg.exec(str):在str中查找所有符合reg规定的关键字,存到数组arr中
正则表达式末尾要加g,表全部,例如/^\d{6,10}$/g
其中:arr[0]:保存了当前关键字的内容
arr.index:保存了当前关键字的位置
reg.lastIndex:保存下次开始查找的位置
例:var str="我喜欢玩游戏,喜欢看小说,喜欢玩轮滑"
var reg=/喜欢/g;
var arr;
while((arr=reg.exec(str))!=null){
console.log("在位置"+arr.index+"发现关键字"+arr[0]);
console.log("下次从"+reg.lastIndex+"开始找");}
例:var str="纪委负责对纪检督察工作";
var reg=/纪[检委](督察)?/;
var count=0;
var arr=null;
while((arr=reg.exec(str))!=null){
str=str.replace(reg,arr[0].length==2?"**":"****");
count++;
}
console.log(str);
console.log(count);
//输出:**负责对****工作 2
8、总结:查找关键字方法比较
① var i=str.search(reg) -->只能判断有没有
缺点:不能指定开始位置(从头到尾),不能返回位置
② var arr=str.match(reg) -->获得所有关键字内容,个数
缺点:不能指定开始位置(从头到尾),不能返回位置
③ var i=str.indexOf("kword"[,starti]) -->从指定位置开始,查找下一个关键字的位置
缺点:不支持正则
④ var arr=reg.exec(str)-->支持正则,即获得内容,又获得位置
9、 正则表达式的贪婪模式与懒惰模式
默认贪婪模式:默认总是匹配最长的符合条件的字符串
原因:.*或.+等引起
懒惰模式:仅匹配最短的符合条件的字符串
贪婪-->懒惰:在可能出现贪婪的地方加上 (.*?)
10、从正则表达式匹配结果中获取子内容:3步
①切割字符串,选择有用的数据(slice)
②用正则表达式中的()括要获取子内容的部分并进行分组
③将正则替换成目标效果(replace)
取*本次*匹配结果中第n个()匹配的子内容(正则中n从1开始),第一组为$1 第二组为$2
例,身份证:
var pid="920182190404057213";
var birth=pid.slice(6,-4);
var reg=/(\d{4})(\d{2})(\d{2})/;
birth=birth.replace(reg,"$1年$2月$3日");
console.log(birth);
//输出: 1904年04月05日