- 正则表达式是一个规则,用于验证字符串。
基础
1. 特殊字符
. 匹配除换行符 \n 之外的任何单字符
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结尾位置
2.转义符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\s 匹配任何空白字符,包括空格、制表符、换页符等等
\S 匹配任何非空白符
\b 匹配一个单词边界,即字与空格间的位置
\B 匹配一个非单词边界
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符
\w 匹配字母、数字、下划线
\W 匹配非字母、数字、下划线
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符
- 转义符可以将特殊字符转义
3.字符集
[字符范围]
匹配中文: [\u4e00-\u9FA5]
4. 量词
前面的规则出现的次数
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
? 匹配前面的子表达式零次或一次
{n}: 匹配n个
{n,}: 匹配>=n个
{n,m}: 匹配n-m个
应用
- 正则表达式表现为一个对象,该对象是通过构造函数RegExp
创建正则对象
- 字面量模式
- 构造函数模式
var reg = /\d+?/ //字面量模式
new RegExp(/ab+c/, 'i'); //构造函数模式
正则实例成员
- global 是否开启全局搜索
- ignoreCase 是否开启忽略大小写
- multiline 是否开启多行
- source 返回正则文本
- test方法:验证某个字符串是否满足规则
- exec方法:execute,执行匹配,得到匹配结果。
var reg = /\d+/g;
var s = "1234abc123aaa";
//得到所有的匹配结果和位置
while (result = reg.exec(s)) {
console.log(`匹配结果:${result[0]},出现位置:${result.index}`);
}
console.log(reg.test(s));
console.log(reg.source); // /\d+/g
正则表达式,默认情况下,适用贪婪模式
在量词后,加上?,表示进入非贪婪模式
字符串对象中的正则方法
- split 字符串分割,可以传入正则
- replace 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串
- search 方法执行正则表达式和 String 对象之间的一个搜索匹配
- match 方法检索返回一个字符串匹配正则表达式的结果
var s = "hello world\tjavascript\nyes";
//将空白字符替换为逗号
console.log(s);
s = s.replace(/\s*\b[a-z]\s*/g, function(match){
return match.toUpperCase().trim();
});
console.log(s);
//按照逗号、空格、横杠、制表符进行分割
// var result = s.split(/[, \-\s]/);
// console.log(s, result);
// var result = s.match(/\d+/)
// console.log(s, result);
// var result = s.search(/\d+/g)
// console.log(s, result);
// result = s.search(/\d+/g)
// console.log(s, result);
//练习
// 1. 书写一个正则表达式,去匹配一个字符串,得到匹配的次数,和匹配的结果
var reg = /\d{2}/gi;
var str = "1123rsf434weasf4214asfr234qdas34";
var n = 0;
while(result = reg.exec(str)){
n ++;
console.log(result[0]);
};
console.log(`总共匹配${n}次`); // 8
// 2.得到一个字符串中中文字符的数量
var reg1 = /[\u4e00-\u9fa5]/g;
var str1= "大锅饭开始的每个快递adfgsfa公司法";
var n2 = 0;
while(reg1.test(str1)){
n2 ++;
};
console.log(n2); // 13
//过滤敏感词汇
var arr = ['敏','感','词','zz','lj'];
var str = '过滤敏感423企鹅23442342ljfsdfzzfasfsf词';
function filterC(str,seq){
var reg = new RegExp(`(${arr.join('|')})+`,'g'); //开启贪婪匹配模式
return str.replace(reg,seq);
};
console.log(filterC(str,'****'));
//'过滤****423企鹅23442342****fsdf****fasfsf****'
进阶
捕获组
用小括号包裹的部分叫做捕获组,捕获组会出现在匹配结果中
捕获组可以命名,叫做具名捕获组
非捕获组 在小括号里面的开始加上?:
//捕获组
var reg = /(\d[a-z])([a-z]+)/g;
var s = "2afsdf-5fdgdfg-9asddf";
while (result = reg.exec(s)) {
console.log(result);
};
var dateStr = "1999-1-10,2000-11-22,2202-11-11";
//得到每一个日期,并得到每个日期的年月日
var reg = /(?<year>\d{4})-(?<mouth>\d{1,2})-(?<day>\d{1,2})/g;
while (result = reg.exec(dateStr)) {
console.log("捕获到的年份:" + result.groups.year);
console.log("捕获到的月份:" + result.groups.mouth);
console.log("捕获到的日期:" + result.groups.day);
}
反向引用
在正则表达式中,使用某个捕获组,\捕获组编号
var s = "aaaaaaaabbbbbbbbbccccccdefgggggggg";
//找出该字符串中连续的字符
var reg = /(\w)\1+/g;
while (result = reg.exec(s)) {
console.log(result[1]);
}
正向断言(预查)
检查某个字符后面的字符是否满足某个规则,该规则不成为匹配结果,并且不称为捕获组
//匹配 数字前面的字母
var s = "sdfsdf3434343sdfsa545454dfsdfsfsd6754";
var reg = /[a-zA-Z](?=\d+)/g; // (?=\d+) 正向断言(预查)
while (result = reg.exec(s)) {
console.log(result);
}
// var s = "334353456"; //数字按照金额排列,由后面数起,每三位一个,
// var reg = /\B(?=(\d{3})+$)/g;
// s = s.replace(reg, ",");
// console.log(s);
负向断言(预查)
检查某个字符后面的字符是否不满足某个规则,该规则不成为匹配结果,并且不称为捕获组
// 返回的是某个字母后面不是数字相连的字母
var s = "afg43223444wr423424243";
var reg = /[a-zA-Z](?!\d+)/g; // (?!\d+) 负向断言(预查)
while (result = reg.exec(s)) {
console.log(result); //a f w
}
//练习
// 判断密码强度
// 密码长度必须是6-12位
// 出现小写字母、大写字母、数字、特殊字符(!@#_,.) -> 强
// 出现小写字母、大写字母、数字 -> 中
// 出现小写字母、大写字母 -> 轻
// 其他 -> 不满足要求
function filterPwd(pwd){
if(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#_,.]).{6,12}$/.test(pwd)){
return '强'
}else if(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,12}$/.test(pwd)){
return '中'
}else if(/^(?=.*[a-z])(?=.*\d).{6,12}$/.test(pwd)){
return '轻'
}else {
return '不满足要求'
}
};
console.log(filterPwd('3453fsdfsdgad'));