正则表达式:描述了一种字符串匹配的模式,可以用来检验一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
形式:var re=new RegExp(”a”,gi);或者
Var re=/a/ig;简写方法 推荐使用 性能更好 不能为空 不然以为是注释
元字符
代表特殊含义的元字符
\d : 0-9之间的任意一个数字 \d只占一个位置
\w : 数字,字母 ,下划线 0-9 a-z A-Z _
\s : 空格或者空白等
\D : 除了\d
\W : 除了\w
\S : 除了\s
. : 除了\n之外的任意一个字符
\ : 转义字符
| : 或者
() : 分组
\n : 匹配换行符
\b : 匹配边界 字符串的开头和结尾 空格的两边都是边界 => 不占用字符串位数
^ : 限定开始位置 => 本身不占位置
$ : 限定结束位置 => 本身不占位置
[a-z] : 任意字母 []中的表示任意一个都可以
[^a-z] : 非字母 []中^代表除了
[abc] : abc三个字母中的任何一个 [^abc]除了这三个字母中的任何一个字符
():,小括号,叫做分组符
var str = '2013-6-7';
var re1 = /\d-+/g; // 全局匹配数字,横杠,横杠数量至少为1,匹配结果为: 3- 6-
var re1 = /(\d-)+/g; // 全局匹配数字,横杠,数字和横杠整体数量至少为1 3-6-
var re2 = /(\d+)(-)/g; // 全局匹配至少一个数字,匹配一个横杠 匹配结果:2013- 6-
同时,正则中的每一个带小括号的项,都叫做这个正则的子项。子项在某些时候非常的有用,比如我们来看一个栗子。
例子:让2013-6-7 变成 2013.6.7
复制代码代码如下:
var str = '2013-6-7';
var re = /(\d+)(-)/g;
str = str.replace(re,function($0,$1,$2){
//replace()中如果有子项,
//第一个参数:$0(匹配成功后的整体结果 2013- 6-),
// 第二个参数 : $1(匹配成功的第一个分组,这里指的是\d 2013, 6)
//第三个参数 : $2(匹配成功的第二个分组,这里指的是 - - )
return $1 + '.'; //分别返回2013. 6.
});
alert( str ); //2013.6.7
//整个过程就是利用子项把2013- 6- 分别替换成了2013. 6. 最终弹出2013.6.7
量词:代表出现的次数
{n,m}:至少出现n次,最多m次
{n,} :至少n次
* :任意次 相当于{0,}
? :零次或一次 相当于{0,1}
+ :一次或任意次相当于 {1,}
{n}: 正好n次
\b : 独立的部分 ( 起始,结束,空格 )
\B : 非独立的部分
[] : 表示某个集合中的任意一个,比如 [abc] 整体代表一个字符 匹配 a b c 中的任意一个,也可以是范围,[0-9] 范围必须从小到大 。
[^a] 整体代表一个字符 :^写在[]里面的话,就代表排除的意思
常用方法:
- test():在字符串中查找符合正则的内容,查到返回true,反之返回false
用法:正则.test(字符串)
例子: 判断是否为数字:
var str = '374829348791';
var re = /\D/; // \D代表非数字
if( re.test(str) ){ // 返回true,代表在字符串中找到了非数字。
alert('不全是数字');
}else{
alert('全是数字');
}
- exec():返回包含第一个匹配项的数组,没有匹配项则返回null
用法:re.exec(str)
返回的数组有两个属性:index和input index表示匹配项在字符串中的位置,input表示应用正则表达式的字符串
注:设置全局标志g,exec每次也只返回一个匹配项;如不设置全局标志g,同一字符串每次返回第一个匹配项的信息,设置之后,每次调用会查找新匹配项
例子:
Var text=“cat,bat ,sat,fat”;
Var re=/.at/;
Var m=re.exec(test);
Consol.log(m.index);//0
Console.log(m[0]);//cat
Console.log(re.lastIndex);//0
//再调用一次
m=re.exec(test);
Consol.log(m.index);//0
Console.log(m[0]);//cat
Console.log(re.lastIndex);//0
Var re1=/.at/g;
Var m=re1.exec(test);
Consol.log(m.index);//0
Console.log(m[0]);//cat
Console.log(re1.lastIndex);//3
//再调用一次
m=re1.exec(test);
Consol.log(m.index);//5
Console.log(m[0]);//bat
Console.log(re1.lastIndex);//8
- match():在字符串中搜索符合规则的内容,搜索成功就返回内容,格式为数组,失败就返回mull ,与exec()类似。
与exec()不同点:
- 用法: str.match(re)
- 一旦设置全局标志g,则match会将所有匹配项返回在一个数组里
4. replace():查找符合正则的字符串,替换成对应的字符串,返回替换后的内容
用法:str.replace(re,新的字符串/回调函数) (在回调函数中,第一个参数指的是每次匹配成功的字符)
例子:敏感词过滤,比如 我爱北京天安门,天安门上太阳升。------我爱*****,****上太阳升。即北京和天安门变成*号,
一开始我们可能会想到这样的方法:
1 2 3 4 | var str = "我爱北京天安门,天安门上太阳升。"; var re = /北京|天安门/g; // 找到北京 或者天安门 全局匹配 var str2 = str.replace(re,'*'); alert(str2) //我爱**,*上太阳升
//这种只是把找到的变成了一个*,并不能几个字就对应几个*。 |
要想实现几个字对应几个*,我们可以用回调函数实现:
复制代码代码如下:
var str = "我爱北京天安门,天安门上太阳升。";
var re = /北京|天安门/g; // 找到北京 或者天安门 全局匹配
var str2 = str.replace(re,function(str){
alert(str); //用来测试:函数的第一个参数代表每次搜索到的符合正则的字符,所以第一次str指的是北京 第二次str是天安门 第三次str是天安门
var result = '';
for(var i=0;i<str.length;i++){
result += '*';
}
return result; //所以搜索到了几个字就返回几个*
});
alert(str2) //我爱*****,***上太阳升
//整个过程就是,找到北京,替换成了两个*,找到天安门替换成了3个*,找到天安门替换成3个*
5.search():在字符串中搜索符合正则的内容,搜索到就返回出现的位置(有多个则返回第一个匹配项的位置),搜索失败则返回-1
用法:str.search(re)
例子:在字符串中找字母b,且不区分大小写
Var str=’abcdef’;
Var re=/B/I;
Console.log(str.search(re));//1