正则表达式
1,对字符串的操作:查找字符串中的所有数字字符串
function findnumber(str) {
var arr =[];
var tmp='';
for(var i = 0; i < str.length; i++)
if(str.charAt(i)<="9" && str.charAt(i)>='0') {
tmp += str.charAt(i);
} else {
if(tmp){
arr.push(tmp);
tmp ='';
}
}
if(tmp) {
arr.push(tmp);
}
alert(arr);
}相当于正则表达式的:alert(str.match(/\d+/g));
2,正则表达式:全部遍历字符串规则
正则表达式主要应用在字符串的筛选和匹配某种语法规则的字符串;
var re=/ /i->不区分大小写 / /g->全局查找
var re= new RegExp("字符串","i 或者 g");
3,元字符
1,$ 放在最后表示匹配最后一个字符,
2,[ .....],表示选择方括号中的东西,有或有多个均可匹配;
3,[ ^....] 表示不包括方括号之间的东西;
4, . 表示除了换行符和其他Unicode码终止符之外的任意字符; 而真正的.在正则表达式为 \.
5,\w 任何ASCII码组成的单词,等价于[a-zA-Z0-9];
6, \W 任何非ASCII码组成的字符,等价于[ ^a-zA-Z0-9];
7,\s 任何Unicode空白符,空格
8,\S 任何非Unicode空白符的字符,注意\w和\s不一样;
9,\d 任何ASCII数字,等价于[0-9];
10, \D 任何非ASCII数字,等价于[^ 0-9];
11,\b :独立的部分(起始,结束,空格)
12,\B:非独立的部分
例如:
var str2="one and two";
alert(/\bone/g.test(str2)); //true
\b指的是一个独立字符,指的可以是起始位置,也可以是结束位置,最重要的是的空格
例题:具体使用在getelementByclassname(字符串)的修复bug里
11,{n, m} 表示重复,匹配前一项至少n次至多m次;
12,{n, } 表示n次或更多次;
13,{n} 表示重复n次;
14,? 匹配前一项0或1次,等价 { 0,1};
15,+ 匹配前一项1 或多次,等价{1,}
16,* 匹配前一项 0次 或多次,等价于{0,}
例题:判断是不是扣扣号
var pattern=/^[1-9]\d{4,11}$/
^写在正则的最前面的时候代表着起始位置,$写在正则的最后边的时候代码末尾位置
17,分组符 | / a+ | b+ | c+/ 可以匹配到多个a或者多个b多个c;
3,正则表达式的五个方法:
1,REx.test(string):正则匹配字符串,匹配成功返回true,匹配失败返回false;
var str = "as12dadasda234asdas897";
var pattren=/asff/i;
alert(pattren.test(str)); //false2,string.search(Rexg)方法,匹配字符串,如果匹配成功就返回成功的位置,如果匹配失败的话就返回-1;
var str = "as12dadasda234asdas897";
console.log(str.search(/\d/i)); //2
正则默认是区分大小写的
3,string.match()方法:匹配字符串,成功就返回一个数组,如果失败就返回null
alert(str.match(/\d+/g)); // +号指的是出现一次或者多次,
正则默认:正则匹配成功就就结束了,不会继续,如果想全部查找:/ /g
4,string.replace(正则,新的字符串):
var str = "as12dadasda234asdas897";
str=str.replace(/\d+/g,"王瑞睿"); //str的赋值
console.log(str);replace方法的第二个参数可以是一个函数 ,也可以是一个字符串
var word="王瑞睿是个大帅比王瑞瑞睿是个大帅比王瑞王睿是个大帅比";
var patt1=/王瑞睿|王瑞瑞睿|王瑞王睿/g;
var newword=word.replace(patt1,function(str){
//str函数的第一个参数,就是匹配成功的字符
var result='';
alert(str.length);
for(var i=0;i<str.length;i++){
result+="*";
}
return result;
})
console.log(newword); //***是个大帅比****是个大帅比****是个大帅比4,正则的匹配子项,首先使用()来实现分组,将每一个正则都分成一个个的小组,
把匹配到的字符串看作是一个母亲的话,每一个被括号括起来的都是一个个的子项,所以有时在操作整个字符串不方便的时候就直接操作子字符串
例如:
var Str='1031-1-1';
var patt=/(\d+)(-)/g
var newstrl=Str.replace(patt,function($1,$2,$3){
//console.log($2);
//console.log($3);
return $2+".";
})相同的,match()方法也具有相同的匹配子项,但是match的正则式不能写g
var Str='1031-';
alert(Str.match(/(\d+)(-)/)) //1031- 1031 -
var str2="abc";
alert(str2.match(/(a)(b)(c)/)); //abc a b c5,正则表达式的字符类:一组相似的元素 []
[ .....],表示选择方括号中的东西,有或有多个均可匹配;
[ ^....] 表示不包括方括号之间的东西;
1,var theword="sqw";
var patt3=/s[weq]w/g
console.log(patt3.test(theword)); //tureconsole.log(/s[wer]w/g.test(theword)) //false
console.log(/s[^weq]w/g.test(theword)) //false 排除
字符类的范围 -:[a-z0-9A-Z]
var theword2="sqw";
console.log(/s[a-z]w/g.test(theword))// trueconsole.log(/s[a-c]w/g.test(theword)) //false
例题:过滤标签
逆向思维:
var pattern=/<[^>]+>/g 就匹配到了所有的html标签
第一:先保证<>之间的内容不为空,第二:直接忽略了<>内容的多少
6,当正则需要传参的时候,一定要使用全称初始化(var re= new RegExp("字符串","i 或者 g"); )
function getelementByclassname(classname){
var patt=new Rexg("\\d"+classname+"\\d");
//在\d前面加\的原因是因为js不能正常的输出特殊字符,在前面加\进行解析
}
7,重复子项 \n(n is a index)
var str3="abca";
var patt4=/(a)(b)(c)\1/g //在正则表达式中,空格都具有意义,所以要求你的输入一定要规范
alert(patt4.test(str3));
在正则表达式中,所有使用()括起来的子项都被赋予了一个索引值,使用这个索引值就可以直接访问每一个子项,所以在上边的代码中的 \1 指的就是(a);并且要求每 一个索引子项的值与初始子项要相同
例如:
var re=/\w\w/g; ->c9(ture) cc(true)
var Re=/(\w)\1/;->c9(false) cc(true)
经常会用到正则的地方:匹配与正则表达式前边一样的东西
例题:
var tstr="sssafgdfsdsssasdvcbvbcb";
var arr=tstr.split('');
arr=arr.sort().join('');
var tpatt=/(\w)\1+/g;
var themax=0;
var thevalue;
arr.replace(tpatt,function($1,$2){ //匹配子项的应用
if($1.length>themax){
themax=$1.length;
thevalue=$2;
}
})
alert(thevalue+":"+themax); //s:88,在实际应用中,我们都直接把正则用一个json对象包裹,使用的时候,极其方便
var Json = {
"中文":/\u4e00-\u9fa5/,
"email":/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/,
"telnum":/\d{3}-\d{8}|\d{4}-\d{7}/,
"qq":/[1-9][0-9]{4,}/,
"ip":/\d+\.\d+\.\d+\.\d+/,
}alert(Json.email.test("986778566@qq.com"));