JavaScript運用正則

exec()和match()區別

  • 當採用非全局匹配的時候,兩個方法的返回值完全一樣。

  • match和exec都只匹配一次,且都會把分組抽出來放到數組後面

    (function(){
        
        let str="antzoane";
        let reg=/(a)(n)/;
        console.log(str.match(reg));
        console.log(reg.exec(str));
    })();
    

  • 當爲全局匹配的時候,match方法返回一個存放所有匹配內容的數組(無視子表達式的匹配)。

  • exex方法返回數組不會存儲所有的匹配,僅存儲第一個匹配到的內容(存儲在數字第一個元素),第二個元素存儲第一個子表達式匹配到的內容,第三個元素存儲第二個子表達式匹配到的內容,以此類推

    (function(){
       
        let str="antzoane";
        let reg=/a(n)/g;
        console.log(str.match(reg));
        console.log(reg.exec(str));
        //再次調用從上次的lastindex開始匹配;
        console.log(reg.exec(str));
    })();

match()和分組匹配

    var reg = /(\d{4})-(\d{2})-(\d{2})/;
    var dateStr = '2018-04-18';
    var s=dateStr.match(reg);
    console.log(s)//arr[0]是匹配的結果,arr[1]是第一個()裏的匹配內容,全局匹配不會返回()裏的內容

    var str="hello my name is ben   ,this is  ";
    var reg2=/ {1,}/g;
    var reg22=/( ){1,}/g//()內看成一個整體去匹配
    console.log(str.match(reg2));
    console.log(str.match(reg22));

replace()和分組捕獲

全部匹配添加修飾

    var str="0816-2323263";
    var reg=/(\d+)(-)(\d+)/g;
    var str2=str.replace(reg,"($1)-$3");//全部匹配添加修飾
    console.log(str2);//(0816)-2323263

(?<name>)與(?:exp)

var str1="123478basd-12aaaaa";
    var reg1=/(\d+)([a-z]+)(\d+)(?<rename>[a-z]+)/g;
    var str21=str1.replace(reg1,"$1hhhhh$<rename>");//(?<name>)捕獲文本到名稱爲name的組裏  (?:exp)匹配exp,不捕獲匹配的文本,也不給此分組分配組號
    console.log(str21);//123478basd-12aaaaa

匹配需要刪除的部分然後置空

 var str23="123478basd12asdsa";
    var reg2=/[a-z]+/g;
    var str22=str23.replace(reg2,"");//匹配需要刪除的部分然後置空
    console.log(str22);//12347812

貪婪與懶惰

  • 在量詞後面加個問號表示懶惰,儘可能少的匹配

   
    var str="abc8defghij7klngon8qrstwxy7";
    var reg1=/8[a-zA-Z0-9]*7/;
    var reg2=/8[a-zA-Z0-9]*?7/;
    var reg3=/8[a-zA-Z0-9]+?/;
    var res1=str.match(reg1);
    var res2=str.match(reg2);
    var res3=str.match(reg3);
    console.log(res1);
    console.log(res2);
    console.log(res3);

零寬斷言

  • (?=exp)向前查找
  • (?<=exp)向後查找
  • (?!exp)匹配後面跟的不是exp的位置
  • (?<!exp)匹配前面不是exp的位置
    (function(){
        var str="http://www.sina.com.cn ";
        var reg1= new RegExp(/.+(:)/g);
        var res1=str.match(reg1);
        var reg2=new RegExp(/.+(?=:)/);
        var res2=str.match(reg2);
        console.log(res1);
        console.log(res2);
    })();

    (function(){
        var a = "價格是123456789.6754";
        var reg4= new RegExp(/(\d)(?=(\d{3})+\.)/g);
        console.log(a.match(reg4));
        var b = a.replace(reg4, '$1,');
        console.log(b)
    })();

    (function(){
        let str="ABCD01:$23.45";
        let reg1=/\$[0-9.]+/g;
        let reg2=/(?<=\$)[0-9.]+/g;
        let res1=str.match(reg1);
        let res2=str.match(reg2);
        console.log(res1);
        console.log(res2);
    })();

匹配固定位數

  • 匹配固定位數時,不能/[1-9]d{4,11}/這樣寫,這樣輸入15位也會從15位中成功匹配11位
  • 只能用^和$匹配字符串開始和結束位置,然後再匹配中間的位數(^$不是從哪裏開始匹配
    function check(val) {
        console.log(val)
        var reg = /^[1-9]\d{4,8}[0-9]$/;//匹配5到10位qq號
        if (!reg.test(val)) {
            alert("輸入有誤");
        }else{
            alert("輸入正確");
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章