正则笔记

什么是正则表达式

正则表达式,在英文中被称作Regular Expression,它是计算机科学中的一个概念,用来检索、替换符合某个格式的文本,在JavaScript中通过内置对象RegExp来支持正则表达式。

常用标识符

\d -> 匹配数字字符
\w -> 匹配word单词字符,包括数字、字母和下划线
\s -> 匹配所有空白符
[a-zA-Z0-9] -> 匹配字母从小写a到z,大写A到Z和数字0到9
\b -> 匹配单词的边界
. -> 通配符
* -> 出现0或者多次
+ -> 出现1或者多次
? -> 出现0或者1次
x{3} -> x出现3次
^$ -> ^表示以xxx开头,$表示以xxx结尾

贪婪模式和非贪婪模式

  • 贪婪模式:整个表达式匹配成功的情况下,尽可能多的去匹配的方式
  • 非贪婪模式:整个表达式匹配成功的情况下,尽可能少的去匹配的方式

一些代码实例

一个去除空格的正则表达式

1
2
3
4
5
var str = "i am a front-end engineer.";
function trim(str){
str = str.replace(/^\s+/,"");
return str.replace(/\s+$/g,"");
}

使用正则实现jQuery方法

hasClass()

1
2
3
4
function hasClass(classAll,cls){
var reg = new RegExp('(^|\\s)'+cls+'($|\\s)','g');
return reg.test(classAll);
}

addClass()

1
2
3
4
5
6
function addClass(classAll,cls){
if(!hasClass(classAll,cls)){
classAll = classAll + " " + cls;
}
return classAll;
}

removeClass()

1
2
3
4
5
6
7
function removeClass(classAll,cls){
if(hasClass(classAll,cls)){
var reg = new RegExp('(^|\\s)'+cls+'($|\\s)','g');
classAll = classAll.replace(reg," ");
return classAll.replace(/\s$/g,"");
}
}

正则判断邮箱

默认格式xx#xx.xx

1
2
3
function isEmail(email){
return /\w+@\S+\.\w+/.test(email);
}

正则判断手机号

手机号的组成:以1开头,第二位为3-9,其它位为整数的11为数字组合。

1
2
3
function isPhoneNumber(number){
return /1[3-9][0-9]{9}$/.test(number)
}

使用正则表达式写一个函数判断用户输入是否为合法用户名

默认格式:长度6-20个字符,只能包括字母、数字、下划线且不能以数字开头

1
2
3
function legalName(username){
return /^[A-z|_][\w]{5,19}$/.test(username);
}

使用正则表达式写一个函数判断用户输入是否为合法密码

合法密码:长度6-20个字符,包括大写字母、小写字母、数字、下划线至少两种

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function userPassword(password){
var count = 0;
if(/^[A-z0-9/_]{6,20}$/.test(password)){
if(/\d/.test(password)){
count += 1;
}
if(/[a-z]/.test(password)){
count += 1;
}
if(/[A-Z]/.test(password)){
count += 1;
}
if(/_/.test(password)){
count += 1;
}
}
if(count >= 2){
return true;
}else{
return false;
}
}

正则取颜色 ->(#121212)

1
2
3
var re = /#[0-9a-f]{6}/ig;
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee #fd2 "
alert( subj.match(re) )

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

var str = 'hello  "hunger" , hello "world"';
 var pat =  /".*"/g; // .为出回车换行外的所有字符,*为出现0或者多次
 str.match(pat); //  由于贪婪模式的原因,它会默认匹配尽量多的内容,所以匹配了第一个和最后一个"
 所以最终的输出结果为["hunger",hello "world"]

改写:
既然上面是贪婪模式,把它改成非贪婪模式即可

var str = 'hello  "hunger" , hello "world"';
var pat =  /".*?"/g; // .为通配,*为出现0或者多次,所以他会匹配到所有
 str.match(pat);

补全如下正则表达式,输出字符串中的注释内容.

贪婪模式:

1
2
3
str = '.. <!-- My -- comment \n test --> .. <!----> .. '
re = /<[^>]+>/g
str.match(re); // '<!-- My -- comment \n test -->', '<!---->'

非贪婪模式

str = '.. <!-- My -- comment \n test --> ..  <!----> .. '
re = /<[\s\S]*?>/g
console.log(str.match(re)); // '<!-- My -- comment \n test -->', '<!---->'