引子示例
如何查找字符串中的数字
var str='ilove283youvery87muchbaby77doyoubleve222me11';
// function findNum(str){
// var arr=[];
// var tmp='';
// for(var i=0;i<str.length;i++){
// if(str.charAt(i)>='0'&&str.charAt(i)<='9'){
// // arr.push(str.charAt(i));
// tmp+=str.charAt(i);
// }else{
// if(tmp){
// arr.push(tmp);
// tmp='';
// }
// }
// }
// if(tmp)arr.push(tmp);
// return arr;
// }
function findNum(str){
return str.match(/\d+/g);
}
alert(findNum(str));
正则的定义
2种方式
var re = /a/;
var re= new RegExp('a');
正则中的一些转义字符
\s : 空格 <br/>
\S : 非空格<br/>
\d : 数字<br/>
\D : 非数字<br/>
\w : 字符(包括字母、数字、下划线)<br/>
\W : 非字符<br/>
========================
. :任意字符 <br>
\. :真正的点
\b :独立的部分(包括:起始、结束、空格)
\B :非独立的部分
var str2='helloworld';
var re2=/\bhello\b/;
alert(re2.test(str2)); //false
一个小示例-边界
var ul=document.getElementById('ul');
var ali=ul.getElementsByTagName('li');
var re=/\bone\b/;
for(var i=0;i<ali.length;i++){
if(re.test(ali[i].className)) {
ali[i].style.backgroundColor='red';
}
}
正则的方法
4类方法:test、search、match、replace
test方法:判断是否匹配,常用于判断
var nons='comonmysi!d3k';
var re1=/\d/;
var re2=/\W/;
if(re1.test(nons)){alert('字符中有数字');}
if(re2.test(nons)){alert('字符中也有非字符');}
search方法:
正则表达式去匹配字符串,如果成功,返回匹配成功的位置;如果失败,返回-1。
正则中默认区分大小写,若不区分大小写,在正则最后加标识i
var re=/B/i;
var re=new RegExp('B','i');
var arr='00iblove!you';
var re=/B/i;
alert(arr.search(re));//1
var re1=new RegExp('B','i');
alert(arr.search(re1));
match方法:
正则匹配字符串,成功,返回匹配成功的数组;失败,返回null
默认:正则匹配成功就会结束,不继续匹配;如果全部查找,加标识g(全局匹配)
var re=/\d+/g;
alert(arr.match(re));
replace方法:
正则去匹配字符串,匹配成功的字符去替换成新的字符
var str='aaa';
var re=/a/;
// alert(str.replace(re,'b')); //baa
var re1=/a/g;
// alert(str.replace(re1,'b')); //bbb
var re2=/a+/;
alert(str.replace(re2,'b')); // b
replace应用:和谐敏感字
replace的第二个参数可以是一个回调函数,该函数的第一个参数是匹配成功的字符
var arr='···';
var re=/男足|主教练|价值/g;
// var arr_gt=arr.replace(re,'*');
var arr_gt=arr.replace(re,function(str){
var m=str.length;
var bb='';
for(i=0;i<m;i++){
bb+='*';
}
return(bb);
})
btn.onclick=function(){
aTareas[1].innerHTML=arr_gt;
}
正则-匹配子项
- 正则中匹配子项用()表示
- 第一个()里的内容叫第一个子项
- 第2个()里的内容叫第2个子项
var date='2021-09-06';
var re=/\d-/g;
// alert(date.match(re));//1-,9-
var re1=/\d+-/g;
// alert(date.match(re1)); //2021-,09-
var re2=/\d-+/g;
// alert(date.match(re2));//1-,9-
var re3=/(\d+)(-)/g;
date.replace(re3,function($0,$1,$2){
// $0:正则的整体;$1:第一个子项;$2:第二个子项
// console.log($0); //2021- 09-
// console.log($1); //2021 09
console.log($2); // - -
})
var str=date.replace(re3,function($0,$1,$2){
return($1+'.');
})
alert(str); // 2021.09.06
match方法的匹配子项
var str='abc';
var re=/abc/;
// alert(str.match(re)); //abc
var re1=/(a)(b)(c)/;
// alert(str.match(re1)); //abc,a,b,c
var re2=/(a)(b)(c)/g;
alert(str.match(re2));//abc 不加g时,match才可以取到子项的集合
正则-字符类
正则表达式中的字符类:一组类似的字符(元素),用[]表示
任意字符[abc]
范围[a-z]/[0-9]
排除[^a]:^写在[]内部,代表排除。例子o[^0-9]t 可代表 oat o?t o t
var str='abc';
var re=/a[bfg]c/;
// alert(re.test(str));
var str2='aoy';
var re2=/a[^mno]y/;
alert(re2.test(str2)); //false
正则-重复子项
\1 重复子项:重复的第一个子项
\2 重复的第二个子项
var re=/(b)(a)(c)\2/; 此处\2 代表a
注意:重复子项和重复的子项是完全一致的,注意下发的区别:
var re =/\w\w/;
var re = /(\w)\1/;
========================================
var str='baca';
var re=/(b)(a)(c)\2/;
alert(re.test(str)); // true
重复子项的小应用
var str='hellogirliloveyouverymuchpleasemarryme!';
var arr=str.split('');
str=arr.sort().join('');
// alert(str);
var num=0;
var value='';
var re=/(\w)\1+/g;
str.replace(re,function($0,$1){
// alert($0);
if(num<$0.length){
num=$0.length;
value=$1;
}
})
alert('重复最多的字符是:'+value+',次数是:'+num) // 重复最多的字符是:e,次数是:6
正则-量词
量词:不确定字符的个数,用{}表示
{4,7}最少出现4次,最多出现7次
{4}正好出现4次
以下意义一致的3组:
+ {1,} ; ? {0,1} ; * {0,}
^在正则起始位置,开始;$在正则结束位置,结束
一些常用的表达式
中文:[\u4e00-\u9fa5]
行首行尾空格:^\s*|\s*$
email: ^\w+@[a-z0-9]+(\.[a-z]+){1,3}$
网址:[a-zA-Z]+://[^\s]*
邮编:[1-9]\d{5}
qq:^[0-9]\d{4,11}$
命名空间:把方法包在一个空间里
var re={chinese:'[\u4e00-\u9fa5]',email:'^\w+@[a-z0-9]+(\.[a-z]+){1,3}$'}
console.log(re.chinese);
console.log(re.email);