-
关键词:正则表达式
我的理解:明确目的规则,了解正则字符含义,拼凑正则规则模板,就像作者写文章
1. 正则表达式,又称规则表达式。计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
2. 正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。
3. 所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
1. \d,\w,\s,[a-zA-Z0-9],\b,.,*,+,?,x{3},^$ 分别是什么?
符号 | 含义 | 备注 | |
---|---|---|---|
\d | 预定义类:数字字符,包括:数字 | [0-9] | |
\w | 预定义类:单词字符,包括:字母、数字、下划线 | [a-zA-Z_0-9] | |
\s | 预定义类:空白符 | [\t\n\x0B\f\r] | |
[a-zA-Z0-9] | 范围类:包括:字母、数字 | ||
. (点) | 元字符:除了换行和回车之外的任意字符 | [^\n\r] | |
* | 量词:出现零次或多次(任意次) | ||
+ | 量词:出现一次或多次(至少出现一次) | ||
? | 量词:出现零次或一次(最多出现一次) | ||
x{3} | 量词:匹配 出现 3 次的 x | ||
\b | 边界:单词边界 | 与\B相反 | |
^ | 边界:以xxx开头 | ||
$ | 边界:以xxx结尾 |
2. 编写函数trim(str),功能:去除字符串两边的空白字符
- 思路
1. 要求:删除开头结尾的空白字符
2. 匹配:匹配开头结尾的空白字符 // 开头^; 空白字符\s; 出现任意次*; 或|; 结尾$;
3. 替换:替换掉匹配到的空白字符 // str.replace(x, y)
- 代码
function trim(str){
var deleteBlank = /^\s*|\s*$/g; // 正则匹配筛选
var back = str.replace(deleteBlank, ''); // 字符串替换去除
return back;
}
var result1 = trim(' dd dd dd ');
var result2 = trim(' ddd ddd dd');
console.log(result1); // dd dd dd
console.log(result2); // ddd ddd dd
3. 编写函数isEmail(str),功能:判断用户输入的是不是邮箱
- 思路
1. 要求:确定邮箱格式:[email protected](对比163的部分规则)
2. 建造:根据要求建立规则模式
3. 判断:用户输入格式是否符合要求
4. 反馈:合法格式——提示:‘欢迎回来!’;非法格式——提示:‘邮箱输入错误!’
5. 防火,防盗,放拼写错误!
- 代码
function isEmail(str){
var emailFormat = /^[a-zA-Z]\w{5,17}@\w+\.[a-z]{2,4}$/g;
var back = emailFormat.test(str); // 注意 test 的拼写,不要错写为 text
if(back === true){
return '欢迎回来!';
}else {
return '邮箱输入错误!';
}
}
var result1 = isEmail('[email protected]');
console.log(result1); // 欢迎回来!
var result2 = isEmail('[email protected]');
console.log(result2); // 邮箱输入错误!
4.编写函数isPhoneNum(str),功能:判断用户输入的是不是手机号
- 思路
1. 要求:确定手机号码格式:1xxxxxxxxxx 【2. 3. 略——翻看第2题】
4. 反馈:合法格式——提示:‘欢迎回来!’;非法格式——提示:‘手机号码输入错误!’
- 代码
function isPhoneNum(str) {
var num = /^1\d{10}$/;
var back = num.test(str);
if(back === true){
return '欢迎回来!';
}else {
return '手机号码输入错误!';
}
}
var result1 = isPhoneNum('18966668888');
console.log(result1); // 欢迎回来!
var result2 = isPhoneNum('6896666');
console.log(result2); // 手机号码输入错误!
5. 编写函数isValidUsername(str),功能:判断用户输入的是不是合法的用户名
- 思路
1. 要求:用户名格式:长度6-20个字符,只能包括字母、数字、下划线
4. 反馈:合法格式——提示:‘用户名输入正确!’;非法格式——提示:‘用户名输入错误!’
- 代码
function isValidUsername(str){
var username = /^\w{6,20}$/g;
var back = username.test(str);
if(back === true){
return '用户名输入正确!';
}else {
return '用户名输入错误!';
}
}
var result1 = isValidUsername('Teemo'); // 萌神提莫
console.log(result1); // 用户名输入错误!
var result2 = isValidUsername('Ezreal'); // 伊泽瑞尔
console.log(result2); // 用户名输入正确!
6. 编写函数isValidPassword(str),功能:判断用户输入的是不是合法密码
- 思路
1. 要求:用户名格式:长度6-20个字符,只包括大写字母、小写字母、数字、下划线,且至少至少包括两种
4. 反馈:合法格式——提示:‘密码正确!’;非法格式——提示:‘密码错误!’
- 代码
function isValidPassword(str) {
if(!/^\w{6,20}$/g.test(str)) return '密码格式错误'; // 非 \w{6,20} 错误
if(/^\d{6,20}$/g.test(str)) return '密码格式错误'; // 全是数字 错误
if(/^[a-z|A-Z]{6,20}$/g.test(str)) return '密码格式错误'; // 全是字母错误
if(/^_{6,20}$/g.test(str)) return '密码格式错误'; // 全是下划线错误
return '密码格式正确'; // 其他正确
}
var result1 = isValidPassword('mima666');
console.log(result1); // 密码格式正确
var result2 = isValidPassword('wodemima');
console.log(result2); // 密码格式错误
var result3 = isValidPassword('mima');
console.log(result3); // 密码格式错误
7. 编写正则表达式,功能:得到如下字符串里所有的颜色
- 思路
1. 要求:颜色格式—— #xxxxxx (16进制颜色)
2. 建造:根据要求建立模式规则
3. 筛选:匹配颜色字符,得到结果
- 代码
/*var re = 正则补全*/
var re = /#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}!\w$/g;
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee "
console.log( subj.match(re) ) // ['#121212', '#AA00ef']
8.1 下面代码输出什么? 为什么?
var str = 'hello "hunger" , hello "world"';
var pat = /".*"/g;
str.match(pat);
- 输出:
" "hunger", hello "world" "
- 原因:
1. 结果以字符串中出现的:第一个引号作为开始,最后一个引号作为结束 ———— 进行匹配划分
2. 首先匹配引号,并将引号作为字符串的开头 "和结尾(不懂正则解析规则)"
3. ' .* ' 相当于 任意字符{0,∞} ,贪婪模式下会按照无穷大进行匹配
4. 正则表达式默认处于贪婪模式(并未触发其非贪婪模式,使用 ‘?’ 即可触发)
5. 贪婪模式:按规定的最大值进行匹配
6. 非贪婪模式:按规定的最小值进行匹配
8.2 改写代码,让其输出["hunger", "world"]
- 思路
1. 两个字符串都以 引号 作为开头和结尾:即见到 引号 就作为开头和结尾进行划分
2. 应该触发其非贪婪模式:按照最小值进行匹配
3. 非贪婪模式:使用 ‘?’ 触发,如下
- 代码改写
var str = 'hello "hunger" , hello "world"';
var pat = /".*?"/g;
str.match(pat);
- 此时输出:
" "hunger", "world" "