资讯专栏INFORMATION COLUMN

JavaScript正则需要注意的地方

Rainie / 1090人阅读

摘要:和区别当采用非全局匹配的时候,两个方法的返回值完全一样。和都只匹配一次,且都会把分组抽出来放到数组后面当为全局匹配的时候,方法返回一个存放所有匹配内容的数组无视子表达式的匹配。

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
(?)与(?:exp)
var str1="123478basd-12aaaaa";
    var reg1=/(d+)([a-z]+)(d+)(?[a-z]+)/g;
    var str21=str1.replace(reg1,"$1hhhhh$");//(?)捕获文本到名称为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的位置

(?

    (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("输入正确");
        }
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/54121.html

相关文章

  • JavaScript正则需要注意地方

    摘要:和区别当采用非全局匹配的时候,两个方法的返回值完全一样。和都只匹配一次,且都会把分组抽出来放到数组后面当为全局匹配的时候,方法返回一个存放所有匹配内容的数组无视子表达式的匹配。 exec()和match()区别 当采用非全局匹配的时候,两个方法的返回值完全一样。 match和exec都只匹配一次,且都会把分组抽出来放到数组后面 (function(){ ...

    wums 评论0 收藏0
  • 一道小小题目引发对javascript支持正则表达式相关方法探讨

    摘要:返回值返回值根据传入的参数类型和规则的不同,返回的内容不同,但总体来说,它是返回一个对象,而不是索引,如果没匹配到任何符合条件的字符串,则返回。 本文发布在我的博客一道小小的题目引发对javascript支持正则表达式相关方法的探讨许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。 以前对于正则是非常惧怕的,因为看不懂和学不会。但最近项目中频繁的...

    Scholer 评论0 收藏0
  • 正则系列——JavaScript正则表达式基础语法巩固篇

    摘要:基础语法巩固正则表达式引擎根据正则去匹配字符的时候,是通过检查索引的方式。妻原配就是好,可以直接使用正则表达式调用它。下面解释一下上面这些常用的元字符查找单个字符,除了换行和行结束符。正则系列文章整理到了 上一章内容:正则表达式实战篇 知识回顾 前2章分别学习了正则表达式入门技巧,以及遇到正则需求该如何去分析问题,还有正则表达式实战的一些场景解释。 这一章内容偏向理论,推荐你点击开头的...

    phodal 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<