正则表达式

问答

\d,\w,\s,[a-zA-Z0-9],\b,.,*,+,?,x{3},^$分别是什么?

  • \d代表正则表达式匹配数字
  • \w 代表查找单词字符,包含字母、数字、下划线
  • \s查找空白字符(空格、tab、换行、回车)
  • [a-zA-Z0-9] 查找小写a-z大写A-Z数字0-9的所有给定集合内的任何字符
  • \b匹配单词边界,指的是一个单词的结束,非单词字符,
  • . 查找单个字符,除了换行和行结束符的其他所有字符
  • * 匹配任何包含零个或多个的字符,默认是尽可能多的匹配
  • n+ 匹配任何包含至少一个 n 的字符串。
  • n?匹配任何包含零个或一个 n 的字符串,尽可能少的匹配,触发非贪婪模式
  • x{3}匹配至少3个x的字符串
    -^n匹配以n开头的字符串
  • n$匹配以n结尾的字符串

贪婪模式和非贪婪模式指什么?

  • 在贪婪模式下,正则表达式尽可能多的重复匹配字符,在查找范围内会一直匹配完,如果整个字符匹配完还回继续回溯,一次一次缩减重复的字符个数,直到剩余的正则都匹配上。正则表达式默认就是贪婪模式
  • 非贪婪模式,在标识符后面放置?来开启非贪婪模式,如?、+?甚至是??。

    代码题

    1.写一个函数trim(str),去除字符串两边的空白字符

    1
    2
    3
    4
    function trim (str) {
    return str.replace(/^\s+/,"").replace(/\s+$/,"");//+防止字符串两边有多个空白字符
    }
    console.log(trim(" abdc dwk "));//abdc dwk

2.使用实现 addClass(el, cls)、hasClass(el, cls)、removeClass(el,cls),使用正则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//提示: el为dom元素,cls为操作的class, el.className获取el元素的class
function hasClass(el, cls){
return el.className.match('\\b'+cls+'\\b')!==unll;
}

function addClass(el, cls){
if(hasClass(el, cls)){
return ;
}
return el.className += ""+cls;

}
function removeClass(el, cls){
if(hasClass(el, cls)){
return el.className.replace(cls,"");
}
return ;
}

3.写一个函数isEmail(str),判断用户输入的是不是邮箱

1
2
3
4
5
6
7
function isEmail(str) {
var exp = /\S+@\S+\.[A-z]{2,}$/;
return exp.test(str);
}
console.log(isEmail("12345jh@132.com"));//true
console.log(isEmail("acb345jh@132.co2"));//false
console.log(isEmail("-acb345jh@132.cn"));//false

4.写一个函数isPhoneNum(str),判断用户输入的是不是手机号

1
2
3
4
5
6
7
function isPhoneNum (str) {
var exp = /^1\d{10}$/;
return exp.test(str);
}
console.log(isPhoneNum("13246773820"));//true
console.log(isPhoneNum("1324677382w"));//false
console.log(isPhoneNum("1324677382012223"));//false

5.写一个函数isValidUsername(str),判断用户输入的是不是合法的用户名(长度6-20个字符,只能包括字母、数字、下划线)

1
2
3
4
5
6
function isValidUsername(str) {
var exp = /^\w{6,20}$/;
return exp.test(str);
}
console.log(isValidUsername("sdlkjl245"));
console.log(isValidUsername("sdl-=kjl245"));

6.写一个函数isValidPassword(str), 判断用户输入的是不是合法密码(长度6-20个字符,包括大写字母、小写字母、数字、下划线至少两种)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function isValidPassword(str) {
var exp = /^\w{6,20}$/;
if (exp.test(str)) {
if(/(^[a-z]+$)|(^[A-Z]+$)|(^_+$)|(^\d+$)/g.test(str)){
return false;
}
return true;
}else{
return false;
};
}

console.log(isValidPassword("KHuhg455"));//true
console.log(isValidPassword("KHu-hg455"));//false
console.log(isValidPassword("KHDFGJJ"));//false

7.写一个正则表达式,得到如下字符串里所有的颜色(#121212)

1
2
3
4
var re = /#[\da-f]{6}/ig;
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee #fd2 "

console.log( subj.match(re) ); // #121212,#AA00ef

8.下面代码输出什么? 为什么? 改写代码,让其输出hunger, world.

1
2
3
 var str = 'hello  "hunger" , hello "world"';
/*var pat = /".*"/g;
console.log(str.match(pat));//""hunger" , hello "world""贪婪模式,尽可能多的匹配字符串,。代表任意字符,尽可能多的查找任意字符,一直到结束,然后回溯查找“,所以输出"hunger" , hello "world"

修改正则,贪婪模式

1
2
3
var str = 'hello  "hunger" , hello "world"';
var pat = /"[^"]*"/g;
console.log(str.match(pat));

修改正则,非贪婪模式

1
2
3
var str = 'hello  "hunger" , hello "world"';
var pat = /".*?"/g;*/
console.log(str.match(pat));

9.补全如下正则表达式,输出字符串中的注释内容. (可尝试使用贪婪模式和非贪婪模式两种方法)

1
2
3
4
5
6
7
8
9
10
var str = '.. <!-- My -- comment \n test --> ..  <!----> .. ';
var re = /<!--[\s\w\-]*-->/g;
var re1 = /<!--[^>]*-->/g;
var re3 = /<!--[^>]*-->/g;
var re2 = /<!--[\w\W]*?-->/g;//三种方法均可以实现


console.log(str.match(re)); // '<!-- My -- comment \n test -->', '<!---->'
console.log(str.match(re1));
console.log(str.match(re2));

10.补全如下正则表达式

1
2
3
4
5
6
var re = /<[^>]+>/g;
var re1 = /<[^>]+?>/g;//两种方法

var str = '<> <a href="/"> <input type="radio" checked> <b>'
console.log(str.match(re)); // '<a href="/">', '<input type="radio" checked>', '<b>'
console.log(str.match(re1));
文章目录
  1. 1. 问答
    1. 1.1. \d,\w,\s,[a-zA-Z0-9],\b,.,*,+,?,x{3},^$分别是什么?
    2. 1.2. 贪婪模式和非贪婪模式指什么?
  2. 2. 代码题
    1. 2.1. 1.写一个函数trim(str),去除字符串两边的空白字符
    2. 2.2. 2.使用实现 addClass(el, cls)、hasClass(el, cls)、removeClass(el,cls),使用正则
    3. 2.3. 3.写一个函数isEmail(str),判断用户输入的是不是邮箱
    4. 2.4. 4.写一个函数isPhoneNum(str),判断用户输入的是不是手机号
    5. 2.5. 5.写一个函数isValidUsername(str),判断用户输入的是不是合法的用户名(长度6-20个字符,只能包括字母、数字、下划线)
    6. 2.6. 6.写一个函数isValidPassword(str), 判断用户输入的是不是合法密码(长度6-20个字符,包括大写字母、小写字母、数字、下划线至少两种)
    7. 2.7. 7.写一个正则表达式,得到如下字符串里所有的颜色(#121212)
    8. 2.8. 8.下面代码输出什么? 为什么? 改写代码,让其输出hunger, world.
    9. 2.9. 9.补全如下正则表达式,输出字符串中的注释内容. (可尝试使用贪婪模式和非贪婪模式两种方法)
    10. 2.10. 10.补全如下正则表达式
,