前言
本期内容是对JavaScript中正则表达式的简单总结;
正文
正则表达式的test方法:
let str="name zhao";
let reg=/zhao/;里面就是正则表达式了;
let res=reg.test(str);
console.log(res);
//在字符串中匹配到zhao返回true;没有则返回false;
多种模式匹配:
let str_1="name zhao";
let str_2="name qian";
let reg=/zhao|qian/;//|相当于或
let res_1=reg.test(str_1);
let res_2=reg.test(str_2);
console.log(res_1,res_2);
通过添加标志忽略大小写:
let str_1="name zhao";
let str_2="name ZhAo";
let reg=/zhao/i;//后面的i就是标志位;表示匹配时忽略大小写;
let res_1=reg.test(str_1);
let res_2=reg.test(str_2);
console.log(res_1,res_2);
提取匹配项 match方法:
let str="zhao qian sun li";
let reg=/i/;
let res=str.match(reg);//注意这里是str的match方法
//match方法返回一个数组,数组中保存了匹配信息,但只有第一个匹配到的信息;
console.log(res);
通过添加标志使全局匹配:
let str="zhao qian sun li";
let reg=/i/g;//g为全局匹配的标志位
let res=str.match(reg);//返回一个数组,数组内有全部匹配到的内容;
console.log(res);
通配符的使用:
let str="zhao qian sun li";
let reg=/.i/g;//.为通配符,表示任何一个值;
let res=str.match(reg);
console.log(res);
字符集的简单使用:
let str="zhao qian sun li";
let reg=/[sql]i/g;//[]表示一个字符集,表示i前面可以是q或者l或者s,仅表示一个字符;
let res=str.match(reg);
console.log(res);
字符集的其他用法:
let str="@qq zhao 123";
let reg_1=/[0-9]/g;//匹配0-9的数字,相当于[0123456789];
let reg_2=/[a-z]/g;//匹配a-z的字符;
let reg_3=/[a-z0-9]/g;//匹配a-z的字符和0-9的数字;
let reg_4=/[^0-9a-z]/g;//加了^相当于不匹配,匹配除0-9a-z的所有字符;
let res_1=str.match(reg_1);
let res_2=str.match(reg_2);
let res_3=str.match(reg_3);
let res_4=str.match(reg_4);
console.log(res_1);
console.log(res_2);
console.log(res_3);
console.log(res_4);
匹配多次出现的字符:
let str_1="naaaaaaame";
let str_2="nme";
let reg_1=/na+/g;//匹配n后面有一到多个a;
let reg_2=/na*/g;//匹配n后面有零到多个a;
console.log(str_1.match(reg_1));
console.log(str_1.match(reg_2));
console.log(str_2.match(reg_1));
console.log(str_2.match(reg_2));
贪婪模式与非贪婪模式:
let str="naaaaaaame";
let reg_1=/na*/g;//贪婪模式尽可能的去多匹配
let reg_2=/na*?/g;//在*后面加?;非贪婪模式,尽可能少的匹配;
console.log(str.match(reg_1));
console.log(str.match(reg_2));
匹配字符串的开头和结尾:
let str_1="name zhao";
let str_2="zhao name"
let reg_1=/^name/g;//在前面加^匹配在开头的name
let reg_2=/zhao$/g;//在结尾加$匹配在结尾的zhao
console.log(str_1.match(reg_1));
console.log(str_1.match(reg_2));
console.log(str_2.match(reg_1));
console.log(str_2.match(reg_2));
字母数字字符集:
let str="namezhao123@163.com";
let reg_1=/\w+/g;//匹配所有字母数字和_;相当于[0-9a-zA-Z_];
let reg_2=/\W+/g;//匹配所有字符;相当于[^0-9a-zA-Z_];
let reg_3=/\d+/g;//匹配所有数字;相当于[0-9];
let reg_4=/\D+/g;//匹配所有的非数字;相当于[^0-9];
console.log(str.match(reg_1));
console.log(str.match(reg_2));
console.log(str.match(reg_3));
console.log(str.match(reg_4));
匹配空格和非空格:
let str="aaa aaa aaa";
let reg_1=/\s/g;//匹配所有空格
let reg_2=/\S/g;//匹配所有非空格
console.log(str.match(reg_1));
console.log(str.match(reg_2));
数量说明符:
let str_1="naaame";
let str_2="naaaaaaame";
let reg_1=/na{2,4}/g;//表示最少匹配两个a,最多匹配4个a;
let reg_2=/na{2,}/g;//表示最少匹配两个a,最多不限;
let reg_3=/na{3}/g;//表示只匹配三个a;
console.log(str_1.match(reg_1));
console.log(str_1.match(reg_2));
console.log(str_1.match(reg_3));
console.log(str_2.match(reg_1));
console.log(str_2.match(reg_2));
console.log(str_2.match(reg_3));
console.log(reg_1.test(str_2));//值得注意的是这里返回true;str_2中存在naaaa,所以返回ture;
有或者没有:
let str_1="name";
let str_2="nme";
let reg=/na?me/g;//a后面加?表示a可有可无,都能匹配;
console.log(str_1.match(reg));
console.log(str_2.match(reg));
正向先行断言,负向先行断言:
let str="name niu";
let reg_1=/n(?=a)/;//正向先行断言;匹配后面是a的n;
let reg_2=/n(?!a)/;//负向先行断言;匹配后面不是a的n;
console.log(str.match(reg_1));
console.log(str.match(reg_2));
//可以看出这两个n并不是一个n;
混合字符组:
let str_1="name";
let str_2="nane";
let reg=/na(me|ne)/g;//括号里表示na后面可以是me或者ne;
console.log(str_1.match(reg));
console.log(str_2.match(reg));
捕获组:
let str="name name name";
let reg=/(name)(\s)\1\2\1/g;//\1表示第一个括号\2表示第二个括号
console.log(str.match(reg));
replace方法:
let str_1="The sky is red";
let reg_1=/red/g;
console.log(str_1.replace(reg_1,"blue"));
//这个方法返回一个替换过的字符串,源字符串并不改变;
let str_2="sky blue";
console.log(str_2.replace(/(\w+)\s(\w+)/g,'$2 $1'));