Javascript正则表达式详解


正则表达式是一种重要的工具,和其他工具一样,它是人们为了解决某一类专门的问题而发明的。
正则表达式的主要用途之一就是搜索变化多端的文本。

1.定义

JS认为正则就是一个对象。
创建一个正则对象:

1
2
var re = new RegExp('规则''选项');//js风格
var re = /规则/选项 //规则没有引号 perl风格

2.选项

选项:辅助操作
i 忽略大小写(ignore)
g 全局,通篇(global)
m 多行模式(muti-line)
m 只影响 ^ $

3.量词

量词的意思就是个数、数量。
n=最少 m=最多 也可以只限定前面一个。
{n} 指定了n个
{n,m} 最少n个,最多m个
{n,} 最少n个,多了不限
{0,m} 最少0个,最多m个

+代表若干个,许多 1个也算 100000个也行。
注意:只管前面的一个,至少重复1次。

1
2
ab+      //重复出现多次的是b
(ab)+ //abab要同时出现(重复) 括号代表子项

*代表任意个:可以没有,等于{0,}
?代表有(1次)或者没有,等于{0,1}

4.修饰符

正则表达式有以下的修饰符:
1、^ 代表匹配开头
2、$ 代表匹配结尾

5.转义符

\d 数字 等于[0-9]
\w 单词(英文数字下划线) 等于[a-z0-9_]
\s 空白字符
. 任意字符
.特点:出现在[]里面,可以直接写,如果出现在[]外面,需要转义 .
\D 非数字
\W 非单词下划线
\S 非空格
\1 重复子项 重复的第一个子项
\2 重复的第二个子项
\b 代表单词边界,用来匹配一个单词的开始和结尾。
\B 代表非独立的部分,匹配不在单词边界的单词部分
\b匹配的是一个这样的位置,这个位置位于一个能够用来构建单词的字符(字母、数字和下划线,也就是与\w相匹配的字符)和一个不能用来构成单词的字符(也就是与\W相匹配的字符)之间。
上面的一段概念引自《正则表达式必知必会》P51
这种特性非常适合去做class类的选定,可以兼容高低版本的浏览器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//正则选取类名对象 无法选取类似-box-类名
function getByClass(oParent,sClass){
var aEle=oParent.getElementsByTagName('*');
var result=[];//结果数组

var re=new RegExp('\\b'+sClass+'\\b');//使用单词边界 注意类似-box-类名

for(var i=0;i<aEle.length;i++){
if(re.test(aEle[i].className)){
result.push(aEle[i]);
}
}

return result;
};

6.方括号

[abc]代表abc里面任选一个字母
[0-9]代表0123456789中任选一个数字
还有^在方括号里面的话代表排除:
[^abc]代表不包括abc里面的任意一个字母
要注意和匹配开头的区别。

7.正则的一些方法

先来看看字符串方法:

1
2
3
4
5
6
7
8
9
10
11
12
strObj.charAt(index)    			返回    字符|undefined
strObj.indexOf(字符|规则) 返回 下标|-1
strObj.lastIndexOf(字符|规则) 返回 下标|-1
strObj.toUpperCase/toLowerCase() 返回 字符
strObj.substring(start,end) 返回 字符|'' *不包含end,
strObj.charCodeAt(index) 返回 编码code/NaN
strObj.fromCharCode(code) 返回 字符/''
strObj.replace(被替换字符|规则,替换成的字符)
strObj.replace(被替换字符|规则,回调函数)

strObj.search(正则) 返回 下标|-1
strObj.match(正则) 返回 数组|null

字符串的一些方法可以和正则表达式配合使用,达到事半功倍的效果。
比如隐藏用户的手机号码:

1
2
3
4
5
6
var tel="18511110788";//转换成185****0788

tel2=tel.replace(/(\d{3})\d+(\d{4})/,function(str,$1,$2){
return $1+'****'+$2;
});
console.log(tel2);//185****0788

获取重复最多的字符和重复的次数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var str = 'assssjdssskssalsssdkjsssdss';
var arr = str.split('');
str = arr.sort().join('');

var value = '';
var index = 0;
var re = /(\w)\1+/g;

str.replace(re,function($0,$1){
if(index<$0.length){
index = $0.length;
value = $1;
}
});
alert('最多的字符:'+value+',重复的次数:'+index);

re.test(字符) 返回 true/false
特点:只要有一个匹配就为true
每次执行test()函数都只查找最多一个匹配,如果找到就立即返回true,否则返回false。

常用的正则表达式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//剔除首位空格
var re=/^\s+|\s+$/g;

//合并空格
str.replace(/\s+/g,' ');
str.match(/\S+/).join(' ');
str.split(/\s+/g).join(' ');


//中国固定电话号码
//最开始的一位肯定是0表示长途,接着两位、三位或者四位数字组成的区号,然后是7位或者8位的电话号码,其中首位不为1(1用于特殊用途)。
var re=/\(?0[1-9]\d{1,3}\)?[-]?[2-9]\d{2,3}[-]?\d{4}/;

//中国邮政编码
//我国邮政编码的规则是前两位表示省、市、自治区,第三位代表邮区,第四位代表县、市、最后两位代表投递邮局。共6位数字,其中第二位不为8(港澳前两位为99,其余省市为0-7)。
var re=/\d(9|[0-7])\d{4}/;

//公民身份证号码
可能为15位或者18位,前6位是户口所在地编码,其中第一位是1~8,此后是出生年月日,出生年份的前两位只能是181920,而且是可选的(兼顾15位),月份中第一位只能是0或者1,日期的第一位只能是0~3,最后一位校验码是数字或者X,可选(兼顾15位)。
var re=/[1-8]\d{5})((18)(19)(20))?\d{2}[0-1]\d[0-3]\d{4}[\dx]?/;

//电子邮件地址
var re=/(\w+\.)*\w+@(\w+\.)+[A-Za-z]+/;

8.在线学习网站

推荐一个在线学习正则表达式的网站:
http://regexone.com/