正则表达式

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)); //false
2,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 c
5,正则表达式的字符类:一组相似的元素 []
[ .....],表示选择方括号中的东西,有或有多个均可匹配;
[ ^....] 表示不包括方括号之间的东西;
1,
var theword="sqw";
var patt3=/s[weq]w/g
console.log(patt3.test(theword)); //ture
console.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))// true
console.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:8
8,在实际应用中,我们都直接把正则用一个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"));
posted @ 2017-11-21 21:45  laiso  阅读(475)  评论(0编辑  收藏  举报