• iOS&Safari不兼容正则表达式的断言匹配及解决办法


    前言:PC端谷歌、安卓手机正常运行;Safari、iPhone报错:SyntaxError: Invalid regular expression: invalid group specifier name

    介绍:

    正则表达式零宽断言一共四种:

    在这里插入图片描述

    通俗理解

    • (?=pattern):后面是什么
    • (?!pattern):后面不是什么
    • (?<=pattern):前面是什么
    • (?

    题型:

    参数:content-string类型
    方法逻辑:
    content长这样:“return ‘1’ === getAnswerById(‘b23ac55e-9265-45a6-ba1b-e18ba7732813’) && ‘2’ === getAnswerById(‘ec35748b-16fa-4d4a-96a1-118cf2910d11’)”,里面会有若干个getAnswerById(xxx)这样的方法。把字符串里的所有getAnswerById(xxx)的xxx抠出来,放在一个数组里返回
    返回:抠出来的xxx数组
    零宽断言:

    interface findStringResult {
        idArr: string[]
    }
    
    function findString(content: string, methodName: string): findStringResult {
        const regexId: RegExp = new RegExp("(?<=(" + methodName + "\\((\\'|\\\"))).*?(?=(\\'|\\\")\\))", 'g');
        return { idArr: content.match(regexId) || [] };
    }
    
    function getIdsFromString(content: string): string[] {
        let idsArr: string[] = [];
        let targetObj: { idArr: string[] } = findString(content, 'getAnswerById');
        targetObj.idArr.forEach(item => {
            return idsArr.includes(item) ? false : idsArr.push(item)
        });
        return idsArr;
    }
    
    const str:string = "return '1' === getAnswerById('b23ac55e-9265-45a6-ba1b-e18ba7732813') && '2' === getAnswerById('ec35748b-16fa-4d4a-96a1-118cf2910d11')"
    console.log(getIdsFromString(str)); // ['b23ac55e-9265-45a6-ba1b-e18ba7732813','ec35748b-16fa-4d4a-96a1-118cf2910d11']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    兼容方案:

    interface findStringResult {
        idArr: string[]
    }
    
    function findString(content: string, methodName: string): findStringResult {
        const regexId: RegExp = new RegExp("(" + methodName + "\\((\\'|\\\").*?(\\'|\\\")\\))", 'g')
        let idArr: string[] = content.match(regexId) || []
    
        if (idArr.length) {
            // 需要判断方法里面的是单引号还是双引号
            let quotes: string = -1 === idArr[0].indexOf("'") ? '"' : "'";
            idArr = idArr.map(idItem => {
                return idItem.split(quotes)[1];
            })
        }
    
        return { idArr: idArr };
    }
    
    function getIdsFromString(content: string): string[] {
        let idsArr: string[] = [];
        let targetObj: { idArr: string[] } = findString(content, 'getAnswerById');
        targetObj.idArr.forEach(item => {
            return idsArr.includes(item) ? false : idsArr.push(item)
        });
        return idsArr;
    }
    
    const str:string = "return '1' === getAnswerById('b23ac55e-9265-45a6-ba1b-e18ba7732813') && '2' === getAnswerById('ec35748b-16fa-4d4a-96a1-118cf2910d11')"
    console.log(getIdsFromString(str)); // ['b23ac55e-9265-45a6-ba1b-e18ba7732813','ec35748b-16fa-4d4a-96a1-118cf2910d11']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    拓展:双斜杠解读,两步走:

    \. 与 \\. 的区别
    \.  第一步:被编译器解释为.   第二步:被正则表达式解释为匹配除换行符(\n、\r)之外的任何单个字符。
    \\. 第一步:被编译器解释为\.  第二步:被正则表达式解释为.
    
    • 1
    • 2
    • 3

    demo是一个较复杂的方法,我拆分出来的,将就点看吧😂

  • 相关阅读:
    向函数传递参数(传值、传引用、传const引用)
    闲人闲谈PS之三十一——新收入准则中的合同损失计提
    网络链接失败怀疑是服务器处于非正常状态?如何用本地电脑查看服务器是否正常?
    Tomcat 多实例
    负载均衡(DR)
    k8s之etcd
    Linux高性能服务器编程 学习笔记 第十三章 多线程编程
    C语言笔记之指针(二)
    squid代理服务器
    iOS ijkplayer 硬解H265(hevc)4k视频问题解决
  • 原文地址:https://blog.csdn.net/weixin_41967475/article/details/127556213