有趣的正则题0

作者: 小遁哥 | 来源:发表于2018-08-05 16:38 被阅读8次

    解析URL中的参数

    var str = "?name=小遁&age=23";
    var pattern = /\?([^=&]+)=([^=&]+)/;
    console.log(str.match(pattern))
    

    输出为
    ["?name=小遁", "name", "小遁", index: 0, input: "?name=小遁&age=23", groups: undefined]

    下面的写法能匹配age=23吗?

     var str = "?name=小遁&age=23";
    var pattern = /\?(([^=&]+)=([^=&]+)&?)*/;
    console.log(str.match(pattern))
    

    输出为
    ["?name=小遁&age=23", "age=23", "age", "23", index: 0, input: "?name=小遁&age=23", groups: undefined]

    因为分组的个数在书写正则的时候就确定了,name=小遁也匹配了,但是被age=23给覆盖了。

    正解为

    var str = "?name=小遁&age=23";
    var pattern = /([^=?&]+)=([^=&]+)/g;
    var obj = {};
    str.replace(pattern,(all,key,value)=>obj[key]=value);
    

    Tips
    调用match方法时,传入的正则表达式带有g,将不会理会分组。

    实现数字的千分位分割

    var str = "12345678";
    var pattern = /\B(?=((\d{3})+(?!\d)))/g;
    var result = str.replace(pattern,(...args)=>{
        console.table(args);
        return ",";
    });
    console.log(result)
    

    为了便于理解我多加了分组

    image.png

    因为分组覆盖的原因,第二个分组的值总是678 这让人很迷惑
    ?= ?! 所在的括号不算做一个分组,这是语法。

    \B 匹配非单词边界
    "78" 7前面和8后面是单词边界 7与8中间不是单词边界
    "78 12" 78后面与12前面是单词边界
    这是上述正则能在数字与数字之间插入符号的原因

    匹配一个非单词边界,他的后面有一个或多个(3个数字),且三个数字后面没有数字

    相当于从左往右加,号,如果按照正向思维从右往左加,号,则很麻烦

    上述正则可改为/\B(?=(\d{3})+$)/g;

    识别一个数不是质数

    已数字12为例,其实12是一个抽象的表示,正则是用来匹配字符串具有某种规律的。
    这就需要在正则与字符串之间做一个转换。

    再深一步,我们如何判断一个数是否为质数呢,就是看这个数能否被2整除,能否被3整除...

    进而一堆物品能否被分为2份,分为3分..。
    我们把12转换成12个1,12个2 这样的字符串,因为他们任意位置2个、3个..组合都可以被视为相同的一组,能够满足算法的需求。

    var number = 12;
    var str = Array(number + 1).join(1);
    var pattern = /^1$|^(11+)\1$/;
    var result = pattern.test(str);
    

    相关连接
    https://coolshell.cn/articles/2704.html

    相关文章

      网友评论

      • 小遁哥:利用\B 实现 数组join的效果

        var str ="1234567";
        var result = str.replace(/\B/g,",");
        console.log(result);

      本文标题:有趣的正则题0

      本文链接:https://www.haomeiwen.com/subject/tmfbvftx.html