题目1: \d,\w,\s,[a-zA-Z0-9],\b,.,*,+,?,x{3},^$分别是什么?
- \d:匹配数字0到9,即[0-9]
- \w:匹配az、AZ、0~9和下划线,即[a-zA-Z_0-9]
- \s:匹配空白符
- [a-zA-Z0-9]:匹配az、AZ和0~9
- \b:以单词做边界
- .:匹配除了回车和换行符以外的字符,即[^\r\n]
- *:匹配零次或多次(任意次),即[0,]
- +:匹配至少1次(1次或多次),即[1,]
- ?:匹配0次或1次,即[0,1]
- x{3}:匹配3个x('xxx'),即/xxx/
-
$:表示以xxx开始,$表示以xxx结束
题目2: 写一个函数trim(str),去除字符串两边的空白字符
const trim = (str)=>{
return str.replace(/^\s+|\s+$/g,'');
}
题目3: 写一个函数isEmail(str),判断用户输入的是不是邮箱
const isEmail = (str)=>{
return /^\w+@[\w.]+$/.test(str);
}
题目4: 写一个函数isPhoneNum(str),判断用户输入的是不是手机号
const isPhoneNum = (str)=>{
return /^(\+029-)?1\d{10}$/.test(str);
}
题目5: 写一个函数isValidUsername(str),判断用户输入的是不是合法的用户名(长度6-20个字符,只能包括字母、数字、下划线)
const isValidUsername = (str)=>{
return /^\w{6,20}$/.test(str);
}
题目6: 写一个函数isValidPassword(str), 判断用户输入的是不是合法密码(长度6-20个字符,只包括大写字母、小写字母、数字、下划线,且至少至少包括两种)
const isValidPassword = (str)=>{
if(/^\w{6,20}$/.test(str)){
let flag = 0;
if(/[A-Z]/.test(str)) {
flag++;
}
if(/[a-z]/.test(str)){
flag++;
}
if(/[0-9]/.test(str)){
flag++;
}
if(/_/.test(str)){
flag++;
}
if(flag>=2){
return true;
}
}
return false;
}
题目7: 写一个正则表达式,得到如下字符串里所有的颜色
1.简单情况:颜色都是6位,且前后多出字符不考虑(例如'color: 12#1234560'也可以匹配)
var re = /#[a-zA-Z0-9]{6}/g; //todo
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee "
console.log( subj.match(re) ) // ['#121212', '#AA00ef']
2.全面考虑:,一个表达式我实现不了
var re = /[\s|:]#([\da-fA-F]{6}|[\da-fA-F]{3})($|;|\s)/g;
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee; color1:#123 ; color2:#3454; ";
let newArray = subj.match(re).map((e)=>{
return e.replace(/^:|\s|;|\s$/g,'');
});
console.log( newArray ); // ["#121212", "#AA00ef", "#123"];
题目8: 下面代码输出什么? 为什么? 改写代码,让其输出['hunger', 'world'].
var str = 'hello "hunger" , hello "world"';
var pat = /".*"/g;
str.match(pat);
//输出["hunger" , hello "world"]
//原因:量词在默认下是尽可能多的匹配的,也就是大家常说的贪婪模式,此模式下会尽可能多的匹配
//==========================
//修改目的:输出['hunger', 'world']
let req = /".*?"/g;
//在量词后面加个?,就是非贪婪模式,该模式会尽可能少的匹配
str.match(req);
//['hunger', 'world']